Maxim_Leo

Untitled

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