Guest User

Untitled

a guest
Jul 20th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. #include <cstdio>
  2. #include <memory>
  3. #include <deque>
  4. #include <limits>
  5. #include <fstream>
  6. #include <math.h>
  7. using namespace std;
  8. const int MAX = 500;
  9.  
  10. int source,dest,n;
  11. int counter=0;
  12. int Cmax=0;
  13. int k=0;
  14. int kk=0;
  15. deque<int> q;
  16. int answer[MAX];
  17. int m[MAX][MAX];
  18. int used[MAX],p[MAX];
  19. int color[MAX];
  20.  
  21. int min(int i, int j)
  22. {
  23. return (i < j) ? i : j;
  24. }
  25.  
  26.  
  27. void bfs(int v, int z)
  28. {
  29. int i,First;
  30. q.push_front(v);
  31. while(!q.empty())
  32. {
  33. First = q[0];
  34. if (First == dest) return;
  35. q.pop_front();
  36. used[First] = 1;
  37. for(i=0;i<n;i++)
  38. if (((m[First][i]) > 0) && (!used[i]))
  39. {
  40. p[i] = First;
  41. q.push_back(i);
  42. }
  43. }
  44. }
  45.  
  46.  
  47.  
  48. void Rebuild(int k, int flow)
  49. {
  50. if (p[k] == -1) return;
  51. Rebuild(p[k],flow);
  52. m[p[k]][k] -= flow;
  53. m[k][p[k]] += flow;
  54. }
  55.  
  56.  
  57.  
  58.  
  59.  
  60. int FindFlow(int k)
  61. {
  62. int x;
  63. if (p[k] == -1) return INT_MAX;
  64. x = FindFlow(p[k]);
  65. return min(x,m[p[k]][k]);
  66. }
  67. void DFSVISIT(int a) {
  68. color[a]=1;
  69.  
  70. for (int i=0; i<n; i++){
  71. if (m[a][i]!=0) {
  72.  
  73.  
  74. if (color[i]==0) {
  75. // pr[ii]=a;
  76. DFSVISIT(i);
  77. }
  78. }
  79. }
  80. color[a]=2;
  81.  
  82.  
  83. answer[counter]=a;
  84. counter++;
  85. }
  86.  
  87.  
  88. void main(void)
  89. {
  90. int a,b,c;
  91. int M;
  92. int MaxFlow,flow;
  93. std::ifstream in("cut.in");
  94. std::ofstream out("cut.out");
  95.  
  96. memset(m,0,sizeof(m));
  97. in>>n>>M;
  98. source=0;
  99. dest=n-1;
  100. MaxFlow = 0;
  101. for (int i=0; i<M; ++i)
  102. {
  103.  
  104. in >>a>>b>>c;
  105. m[a-1][b-1] = c;
  106. if (c< Cmax) c=Cmax;
  107. }
  108.  
  109. for (int i=Cmax; i>0; i/=2) {
  110. kk++;
  111. }
  112. kk+=1;
  113. for (int i=0; i<kk; i++) {
  114. k*=2;
  115. }
  116.  
  117.  
  118.  
  119.  
  120. for (int i = kk; i >0; i /= 2) {
  121. while (1)
  122. {
  123. q.clear();
  124. memset(p,-1,sizeof(p));
  125. memset(used,0,sizeof(used));
  126. memset(color,0,sizeof(color));
  127. bfs(source,i);
  128. flow = FindFlow(dest); if (flow == INT_MAX) break;
  129. MaxFlow += flow;
  130. Rebuild(dest,flow);
  131. }
  132. }
  133. /*
  134.  
  135.  
  136. for (int i=0; i<n;i++) {
  137. for (int j=0;j<n;j++) {
  138.  
  139. out<< m[i][j]<< " ";
  140. }
  141. out<<"\n";
  142.  
  143. }*/
  144. DFSVISIT (0);
  145. out<<counter<<"\n";
  146. for (int i=0; i<counter-1;i++){ out << answer[i]+1<< " ";}
  147. out << answer[counter-1]+1;
  148.  
  149.  
  150.  
  151.  
  152. }
Add Comment
Please, Sign In to add comment