Advertisement
Guest User

Untitled

a guest
Feb 27th, 2015
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.60 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <queue>
  4.  
  5. struct Edge {
  6. int c;
  7. int f;
  8. int end;
  9. int back;
  10. Edge() {}
  11. Edge(int c, int f, int end, int back) : c(c), f(f), end(end), back(back) {}
  12. };
  13.  
  14. const int MAX_N = 53;
  15. const int INT_MAX = 2000000000;
  16.  
  17. char Map[MAX_N][MAX_N];
  18. std::vector<Edge> Graph[MAX_N*MAX_N];
  19. int P[MAX_N*MAX_N];
  20.  
  21. std::queue<int> Q;
  22. std::queue<long long int> Min;
  23.  
  24.  
  25. int Coord(int x, int y, int n) {
  26. return x + y*n;
  27. }
  28.  
  29.  
  30. void AddEdges(int n1, int n2, int c1, int c2) {
  31.  
  32. int size1 = Graph[n1].size();
  33. int size2 = Graph[n2].size();
  34.  
  35. Graph[n1].push_back(Edge(c1, 0, n2, size2));
  36. Graph[n2].push_back(Edge(c2, 0, n1, size1));
  37. }
  38.  
  39. void Restore(int n, int s, int n1)
  40. {
  41. for(int i=0; i<n; i++)
  42. P[i] = -1;
  43. while(!Q.empty()) {
  44. Q.pop();
  45. Min.pop();
  46. }
  47.  
  48. int u, size;
  49. Edge v;
  50. P[s] = 1;
  51. Q.push(s);
  52. while(!Q.empty()) {
  53. u = Q.front();
  54. Q.pop();
  55. size = Graph[u].size();
  56. for(int i=0; i<size; i++) {
  57. v = Graph[u][i];
  58. if(v.f == v.c || P[v.end] == 1)
  59. continue;
  60.  
  61. Map[v.end%n1][v.end/n1] = '#';
  62. Q.push(v.end);
  63. P[v.end] = 1;
  64. }
  65. }
  66. }
  67.  
  68.  
  69. bool BFS(int n, int s, int t, int &flow)
  70. {
  71. //Clear
  72. while(!Q.empty()) {
  73. Q.pop();
  74. Min.pop();
  75. }
  76. for(int i=0; i<n; i++)
  77. P[i] = -1;
  78.  
  79. int u, size, min, min2;
  80.  
  81. //Prepare
  82. P[s] = s;
  83. Q.push(s);
  84. Min.push(INT_MAX);
  85.  
  86.  
  87. while(!Q.empty()) {
  88.  
  89. u = Q.front();
  90. min = Min.front();
  91. Q.pop();
  92. Min.pop();
  93. size = Graph[u].size();
  94.  
  95. //for all children
  96. for(int i=0; i<size; i++) {
  97. Edge v = Graph[u][i];
  98.  
  99. if(P[v.end] == -1 && v.c - v.f > 0) {
  100. P[v.end] = u;
  101.  
  102. if(v.end == t) {
  103. //t found
  104. min = std::min(min, v.c - v.f);
  105.  
  106. int v2 = v.end;
  107. Edge *edge;
  108. while(v2 != s) {
  109. for(int i=0; i<Graph[P[v2]].size(); i++) {
  110. edge = &Graph[P[v2]][i];
  111. if(edge->end == v2) {
  112. edge->f += min;
  113. Graph[edge->end][edge->back].f -= min;
  114. break;
  115. }
  116. }
  117. v2 = P[v2];
  118. }
  119. flow += min;
  120. return false;
  121. }
  122.  
  123. //normal
  124. min2 = std::min(min, v.c - v.f);
  125. Q.push(v.end);
  126. Min.push(min2);
  127. }
  128. }
  129. }
  130. return true;
  131. }
  132.  
  133.  
  134.  
  135. int main()
  136. {
  137. int z, n, m, s, t, flow;
  138. int size;
  139. char c;
  140. scanf("%d", &z);
  141. while(z--) {
  142. flow = 0;
  143. scanf("%d%d", &n, &m);
  144. size = (n+2)*(m+2);
  145. for(int i=0; i<size+2; i++)
  146. Graph[i].clear();
  147.  
  148. for(int i=1; i<=n; i++) {
  149. scanf("%s", &Map[i][1]);
  150. Map[i][0] = Map[i][m+1] = 'x';
  151. }
  152.  
  153. for(int i=0; i<m+2; i++) {
  154. Map[0][i] = Map[n+1][i] = 'x';
  155.  
  156. }
  157. s = size;
  158. t = size+1;
  159. size += 2;
  160. n+=2;
  161. m+=2;
  162.  
  163.  
  164. for(int i=0; i<n; i++)
  165. for(int j=0; j<m; j++) {
  166. if(Coord(i+1, j, n) < size-2)
  167. AddEdges(Coord(i, j, n), Coord(i+1, j, n), 1, 1);
  168. if(Coord(i, j+1, n) < size-2)
  169. AddEdges(Coord(i, j, n), Coord(i, j+1, n), 1, 1);
  170. if(Map[i][j] == '#')
  171. AddEdges(s, Coord(i, j, n), INT_MAX, 0);
  172. if(Map[i][j] == 'x')
  173. AddEdges(Coord(i, j, n), t, INT_MAX, 0);
  174. }
  175.  
  176. while(true)
  177. if(BFS(size, s, t, flow))
  178. break;
  179.  
  180. Restore(size, s, n);
  181.  
  182.  
  183. printf("%d\n", flow);
  184. for(int i=1; i<n-1; i++) {
  185. for(int j=1; j<m-1; j++)
  186. printf("%c", Map[i][j]);
  187. printf("\n");
  188. }
  189. }
  190. return 0;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement