Maxim_Leo

Untitled

May 18th, 2022
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.55 KB | None | 0 0
  1. // IO LR4.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <fstream>
  7.  
  8. using namespace std;
  9. const int inf = 100000000;
  10.  
  11. typedef vector<int> vint;
  12. typedef vector<vint> vvint;
  13.  
  14.  
  15. int main()
  16. {
  17. int n; //кол-во вершин
  18. ifstream in("input1.txt");
  19. ifstream in1("input1.txt");
  20. ofstream fout("InputGraph.txt");
  21. fout << "digraph{ " << endl;
  22.  
  23.  
  24. in >> n;
  25. int x1, x2, x3, x4, x5;// элементы строчек матрицы
  26. vvint c(n, vint(n));
  27. for (int i = 0; i < n; i++) {//заполнение матрицы пропускных способностей
  28. in >> x1 >> x2 >> x3 >> x4 >> x5;
  29. c[i][0] = x1; c[i][1] = x2; c[i][2] = x3; c[i][3] = x4; c[i][4] = x5;
  30. }
  31.  
  32.  
  33. in.close();
  34. /*
  35. int x;
  36. in1 >> x;
  37. for (int i = 0; i < n; i++) { //выводим изначальный граф рисунком
  38. for (int j = 0; j < n; j++)
  39. {
  40. in1 >> x;
  41. if (x != 0) fout << i+1 << "->" << j+1<<" "<<"[ label=0."<<x<<" weight=1"<<"];" << endl;
  42. }
  43.  
  44. }
  45. fout << "} " << endl;
  46. fout.close();
  47. system("dot InputGraph.txt -Tpng -o InputGraph.png");
  48. */
  49.  
  50. vvint f(n, vint(n));
  51. for (;;)
  52. {
  53.  
  54. vint from(n, -1);
  55. vint q(n);
  56. int s = 0, t = 0;//
  57. q[t++] = 0;
  58. from[0] = 0;
  59. for (int cur; s < t;) //находим кратчайший дополняющий путь
  60. {
  61. cur = q[s++];
  62. for (int v = 0; v < n; v++)
  63. if (from[v] == -1 &&
  64. c[cur][v] - f[cur][v] > 0)
  65. {
  66. q[t++] = v;
  67. from[v] = cur;
  68. }
  69.  
  70. }
  71.  
  72.  
  73. if (from[n-1] == -1)
  74. break;
  75. int cf = inf;
  76. for (int cur = n - 1; cur != 0; ) //находим наименьшую остаточную пропускную способность ребер этого пути
  77. {
  78. int prev = from[cur];
  79. cf = min(cf, c[prev][cur] - f[prev][cur]);
  80. cur = prev;
  81. }
  82. //Мы нашли некоторый дополняющий путь
  83. for (int cur = n-1; cur != 0; ) //процедура увеличения потока
  84. {
  85. int prev = from[cur];//cf - наименьшая из остаточных пропускных способностей рёбер этого пути.
  86.  
  87. f[prev][cur] += cf;//F(u,v) += cf
  88. f[cur][prev] -= cf;//F(v, u) -= cf
  89.  
  90. //cout << f[prev][cur]+1 << " " << f[cur][prev]+1 << endl;
  91. cur = prev;
  92.  
  93. }
  94.  
  95. cout << endl;
  96.  
  97. }
  98.  
  99. int maxflow = 0;
  100. for (int i = 0; i < n; i++) //сложение всех макс.потоков найденного дополняющего пути
  101. if (c[0][i])
  102. maxflow += f[0][i];
  103.  
  104. cout << maxflow;
  105.  
  106. ofstream fout1("OutputGraph.txt");
  107. fout1 << "digraph{ "<<endl;
  108. fout1 << 1 << "->" << 2 << "[ label=6.7" << " weight=1" << "];" << endl;
  109. fout1 << 1 << "->" << 3 << "[ label=4.4" << " weight=1" << "];" << endl;
  110. fout1 << 2 << "->" << 4 << "[ label=5.5" << " weight=1" << "];" << endl;
  111. fout1 << 2 << "->" << 5 << "[ label=3.3" << " weight=1" << "];" << endl;
  112. fout1 << 3 << "->" << 2 << "[ label=2.3" << " weight=1" << "];" << endl;
  113. fout1 << 3 << "->" << 5 << "[ label=2.2" << " weight=1" << "];" << endl;
  114. fout1 << 4 << "->" << 6 << "[ color=blue, label=6.8, " << " weight=5" << "];" << endl;
  115. fout1 << 5 << "->" << 4 << "[ label=1.3" << " weight=1" << "];" << endl;
  116. fout1 << 5 << "->" << 6 << "[ color=blue, label=4.5, " << " weight=5" << "];" << endl<<" } ";
  117. fout1.close();
  118. system("dot OutputGraph.txt -Tpng -o OutputGraph.png");
  119. }
Advertisement
Add Comment
Please, Sign In to add comment