Advertisement
Guest User

Untitled

a guest
Oct 21st, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4. #include <math.h>
  5. #include <algorithm>
  6. using namespace std;
  7. const long inf = 1e9;
  8. struct ver {
  9. long pr, potok;
  10. bool obr, use;
  11. };
  12. struct line {
  13. long from;
  14. bool obr;
  15. };
  16. int main() {
  17. long n, a, b, c, v1 = 1, m;
  18. cin >> n >> m;
  19. n++;
  20. vector<vector<ver> > g(n, vector<ver>(n, {0, 0, false, false}));
  21. for (long i = 0; i < m; i++) {
  22. cin >> a >> b >> c;
  23. g[a][b] = { c, 0, false, true};
  24. g[b][a] = { c, 0, true, true};
  25. }
  26. bool out = false;
  27. while (!out) {
  28. out = true;
  29. long minp = inf;
  30. vector<long> d(n, inf);
  31. d[1] = 0;
  32. vector<long> id(n, 0);
  33. deque<int> q;
  34. q.push_back(v1);
  35. vector<line> p(n, { -1, false });
  36. while (!q.empty())
  37. {
  38. int v = q.front();
  39. q.pop_front();
  40. id[v] = 1;
  41. for (long i = 1; i < g[v].size(); ++i)
  42. {
  43. long to = i, len = g[v][i].potok, pr = g[v][i].pr;
  44. if (len != pr && g[v][i].use) {
  45. out = false;
  46. if (d[to] > d[v] + len)
  47. {
  48. if (g[v][i].obr) {
  49. p[to] = { v, true };
  50. }
  51. else {
  52. p[to] = { v, false };
  53. }
  54. d[to] = d[v] + len;
  55. if (id[to] == 0)
  56. q.push_back(to);
  57. else if (id[to] == 1)
  58. q.push_front(to);
  59. id[to] = 1;
  60. }
  61. }
  62. }
  63. }
  64. long i = n - 1;
  65. while (p[i].from != -1) {
  66. long from = p[i].from;
  67. bool obr = p[i].obr;
  68. if (obr)
  69. minp = min(minp, g[from][i].potok);
  70. else
  71. minp = min(minp, g[from][i].pr- g[from][i].potok);
  72. i = from;
  73. }
  74. i = n - 1;
  75. while (p[i].from != -1) {
  76. long from = p[i].from;
  77. bool obr = p[i].obr;
  78. if (obr) {
  79. g[from][i].potok -= minp;
  80. g[i][from].potok += minp;
  81. }
  82. else {
  83. g[from][i].potok += minp;
  84. g[i][from].potok += minp;
  85. }
  86. i = from;
  87. }
  88. }
  89. long potok = 0;
  90. for (long i = 1; i < g[n - 1].size(); i++) {
  91. if (g[n - 1][i].obr)
  92. potok += g[n - 1][i].potok;
  93.  
  94. }
  95. cout << potok;
  96. return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement