Advertisement
welwelar

lr3.cpp.pa

May 21st, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. #include <vector>
  2. #include <stack>
  3. #include <iostream>
  4. #include <algorithm>
  5. #define N 20
  6.  
  7. using namespace std;
  8.  
  9. struct way
  10. {
  11. int max_b = 0;
  12. int result_b = 0;
  13. bool flag = false;
  14. };
  15.  
  16. class Graph
  17. {
  18. char start;
  19. char finish;
  20. int max_flow;
  21.  
  22. vector<char> find_path()
  23. {
  24. vector<char> tmp_path;
  25. vector<char> vis = vertex; //
  26. stack<int> stack;
  27. stack.push(0);
  28.  
  29. do
  30. {
  31. vector<char> arr; //массив вершин, в которые можно пойти из данной
  32. int size = arr.size();
  33. int cur = stack.top();
  34. tmp_path.push_back(vertex[cur]);
  35. if(cur == 1) return tmp_path;
  36. for(int i = 1; i < vertex.size(); i++)
  37. {
  38. if(vis[i]!=0 && (edges[cur][i].max_b))
  39. {
  40. arr.push_back(vertex[i]);
  41. }
  42. }
  43. if(arr.size() == size)
  44. {
  45. int i = stack.top();
  46. stack.pop();
  47. tmp_path.pop_back();
  48. while(!stack.empty() && !tmp_path.empty() && (edges[stack.top()][i].max_b))
  49. {
  50. if(stack.top() == 1)
  51. {
  52. if(tmp_path.back() != vertex[1])
  53. tmp_path.push_back(vertex[1]);
  54. return tmp_path;
  55. }
  56. tmp_path.pop_back();
  57. i = stack.top();
  58. stack.pop();
  59. }
  60. }
  61. else
  62. {
  63. sort(arr.begin(), arr.end());
  64. for(int i = arr.size() - 1; i >= 0; i--)
  65. stack.push(find(vertex.begin(), vertex.end(), arr[i]) - vertex.begin());
  66. }
  67. } while (!stack.empty());
  68. return vector<char>();
  69. }
  70.  
  71.  
  72. public:
  73. vector<char> vertex;
  74. way** edges;
  75.  
  76. Graph(char start, char finish)
  77. {
  78. max_flow = 0;
  79. edges = new way*[N];
  80. for (int i = 0; i < N; i++)
  81. edges[i] = new way[N];
  82. }
  83.  
  84. ~Graph()
  85. {
  86. for (int i = 0; i < N; i++)
  87. delete[] edges[i];
  88. delete[] edges;
  89. }
  90.  
  91. int get_index(char name)
  92. {
  93. for (int i = 0; i<vertex.size(); i++)
  94. {
  95. if (vertex[i] == name)
  96. return i;
  97. }
  98. vertex.push_back(name);
  99. return vertex.size()-1;
  100. }
  101.  
  102. int find_flow()
  103. {
  104. vector<char> path = find_path();
  105. int cur_b = 0;
  106. while(path.size())
  107. {
  108. int i = get_index(path[0]);
  109. int j = get_index(path[1]);
  110. int tmp = edges[i][j].max_b;
  111. for (int k = 2; k < path.size(); k++)
  112. {
  113. i=j;
  114. j = get_index(path[k]);
  115. if (edges[i][j].max_b < tmp)
  116. tmp = edges[i][j].max_b;
  117. }
  118.  
  119. max_flow += tmp;
  120.  
  121. i = get_index(path[0]);
  122. j = get_index(path[1]);
  123. edges[i][j].max_b -= tmp;
  124. edges[i][j].result_b += tmp;
  125. for (int k = 2; k < path.size(); k++)
  126. {
  127. i = j;
  128. j = get_index(path[k]);
  129. edges[i][j].max_b -= tmp;
  130. edges[i][j].result_b += tmp;
  131. }
  132.  
  133. path = find_path();
  134. }
  135. return max_flow;
  136. }
  137.  
  138. void print_answer()
  139. {
  140. int i, j;
  141. vector<char> order = vertex;
  142. sort(order.begin(), order.end());
  143. cout << max_flow << endl;
  144. for (int k = 0; k < vertex.size(); k++)
  145. {
  146. i = get_index(order[k]);
  147. for (int l = 0; l < vertex.size(); l++)
  148. {
  149. j = get_index(order[l]);
  150. if (edges[i][j].flag)
  151. cout << vertex[i] << ' ' << vertex[j] << ' ' << edges[i][j].result_b << endl;
  152. }
  153. }
  154. }
  155. };
  156.  
  157.  
  158. int main()
  159. {
  160. int n;
  161. cin >> n;
  162. char start, finish;
  163. cin >> start >> finish;
  164. Graph graph(start, finish);
  165. graph.vertex.push_back(start);
  166. graph.vertex.push_back(finish);
  167. for (int i = 0; i < n; i++)
  168. {
  169. int l;
  170. cin >> start >> finish >> l;
  171. int index_f = graph.get_index(start);
  172. int index_d = graph.get_index(finish);
  173. graph.edges[index_f][index_d].max_b = l;
  174. graph.edges[index_f][index_d].flag = true;
  175. }
  176. graph.find_flow();
  177. graph.print_answer();
  178.  
  179. return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement