每个门每个时间只能出一个人,那就把每个门拆成多个,对应每个时间。

不断增加时间,然后增广,直到最大匹配。

  1. //#pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<iostream>
  7. #include<sstream>
  8. #include<cmath>
  9. #include<climits>
  10. #include<string>
  11. #include<map>
  12. #include<queue>
  13. #include<vector>
  14. #include<stack>
  15. #include<set>
  16. using namespace std;
  17. typedef long long ll;
  18. typedef unsigned long long ull;
  19. typedef pair<int,int> pii;
  20. #define pb(a) push(a)
  21. #define INF 0x1f1f1f1f
  22. #define lson idx<<1,l,mid
  23. #define rson idx<<1|1,mid+1,r
  24. #define PI 3.1415926535898
  25. template<class T> T min(const T& a,const T& b,const T& c)
  26. {
  27. return min(min(a,b),min(a,c));
  28. }
  29. template<class T> T max(const T& a,const T& b,const T& c)
  30. {
  31. return max(max(a,b),max(a,c));
  32. }
  33. void debug()
  34. {
  35. #ifdef ONLINE_JUDGE
  36. #else
  37. freopen("data.in","r",stdin);
  38. // freopen("d:\\out1.txt","w",stdout);
  39. #endif
  40. }
  41. int getch()
  42. {
  43. int ch;
  44. while((ch=getchar())!=EOF)
  45. {
  46. if(ch!=' '&&ch!='\n')return ch;
  47. }
  48. return EOF;
  49. }
  50.  
  51. int DX[] = {, , , -};
  52. int DY[] = {, , -, };
  53.  
  54. const int maxn = ;
  55. char grid[maxn][maxn];
  56. int n, m;
  57. int dist[maxn][maxn][maxn][maxn];
  58. int vis[maxn][maxn];
  59. vector<int> dx,dy,px,py;
  60.  
  61. void bfs(int X,int Y)
  62. {
  63. queue<int> qx,qy;
  64. qx.push(X); qy.push(Y);
  65. memset(vis, , sizeof(vis));
  66. vis[X][Y] = true;
  67. while(!qx.empty())
  68. {
  69. int x = qx.front(); qx.pop();
  70. int y = qy.front(); qy.pop();
  71. for(int d=; d<; d++)
  72. {
  73. int nx = x + DX[d];
  74. int ny = y + DY[d];
  75. if(nx>=&&nx<=n&&ny>=&&ny<=m&&grid[nx][ny]=='.'&&!vis[nx][ny])
  76. {
  77. vis[nx][ny] = true;
  78. dist[X][Y][nx][ny] = dist[X][Y][x][y] + ;
  79. qx.push(nx);
  80. qy.push(ny);
  81. }
  82. }
  83. }
  84. }
  85.  
  86. void prework()
  87. {
  88. memset(dist, -, sizeof(dist));
  89. dx.clear(); dy.clear();
  90. px.clear(); py.clear();
  91.  
  92. for(int i=; i<=n; i++)
  93. for(int j=; j<=m; j++)
  94. {
  95. if(grid[i][j]=='D')
  96. {
  97. dx.push_back(i);
  98. dy.push_back(j);
  99. dist[i][j][i][j]=;
  100. bfs(i, j);
  101. }else if(grid[i][j]=='.')
  102. {
  103. px.push_back(i);
  104. py.push_back(j);
  105. }
  106. }
  107. //printf("prework: %d %d\n",dx.size(), px.size());
  108. }
  109.  
  110. const int maxv = * + ;
  111. int id[maxn][maxn][];
  112. bool used[maxv];
  113. int match[maxv];
  114. int vcnt;
  115. vector<int> g[maxv];
  116. int ID(int x, int y, int t)
  117. {
  118. int &a = id[x][y][t];
  119. if(a==) a=++vcnt;
  120. return a;
  121. }
  122. void add(int u,int v)
  123. {
  124. g[u].push_back(v);
  125. g[v].push_back(u);
  126. }
  127. void init()
  128. {
  129. for(int i=; i<maxv; i++)
  130. g[i].clear();
  131. memset(id, , sizeof(id));
  132. }
  133. bool dfs(int u)
  134. {
  135. used[u] = true;
  136. for(int i = ; i < g[u].size(); i++)
  137. {
  138. int v = g[u][i];
  139. int w = match[v];
  140. if(w<||!used[w]&&dfs(w))
  141. {
  142. match[u] = v;
  143. match[v] = u;
  144. return true;
  145. }
  146. }
  147. return false;
  148. }
  149. int solve()
  150. {
  151. init();
  152. memset(match, -, sizeof(match));
  153. int res = ;
  154. vcnt = ;
  155. if(px.size() == ) return ;
  156. for(int t=; t<=; t++)
  157. {
  158. for(int i=; i<dx.size(); i++)
  159. {
  160. for(int j=; j<px.size(); j++)
  161. {
  162. int dis = dist[dx[i]][dy[i]][px[j]][py[j]];
  163. if(dis!=- && dis <= t)
  164. {
  165. int u = ID(dx[i], dy[i], t);
  166. int v = ID(px[j], py[j], );
  167. add(u, v);
  168. add(v, u);
  169. }
  170. }
  171. }
  172. for(int i=; i<dx.size(); i++)
  173. {
  174. int u = ID(dx[i], dy[i], t);
  175. memset(used, , sizeof(used));
  176. if(dfs(u))
  177. res++;
  178. }
  179. if(res == px.size()) return t;
  180. }
  181. return -;
  182. }
  183. int main()
  184. {
  185. debug();
  186. int t;
  187. scanf("%d", &t);
  188. for(int ca=; ca<=t; ca++)
  189. {
  190. scanf("%d%d", &n, &m);
  191. for(int i=; i<=n; i++)
  192. scanf("%s", grid[i]+);
  193.  
  194. prework();
  195.  
  196. int ans = solve();
  197. if(ans != -)
  198. printf("%d\n", ans);
  199. else printf("impossible\n");
  200. }
  201. return ;
  202. }

POJ 3057 Evacuation 二分图匹配的更多相关文章

  1. TTTTTTTTTTTTT poj 3057 Evacuation 二分图匹配+bfs

    题意:见挑战230页 #include <iostream> #include <cstdio> #include <cstring> #include <c ...

  2. POJ 3057 Evacuation (二分匹配)

    题意:给定一个图,然后有几个门,每个人要出去,但是每个门每个秒只能出去一个,然后问你最少时间才能全部出去. 析:初一看,应该是像搜索,但是怎么保证每个人出去的时候都不冲突呢,毕竟每个门每次只能出一个人 ...

  3. POJ3057 Evacuation 二分图匹配+最短路

    POJ3057 Evacuation 二分图匹配+最短路 题目描述 Fires can be disastrous, especially when a fire breaks out in a ro ...

  4. POJ 3057 Evacuation(二分图匹配+BFS)

    [题目链接] http://poj.org/problem?id=3057 [题目大意] 给出一个迷宫,D表示门,.表示人,X表示不可通行, 每个门每时间单位只允许一个人通过, 每个人移动一格的为一时 ...

  5. POJ 1274 裸二分图匹配

    题意:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶,告诉每头奶牛愿意产奶的牛棚编号,求出最多能分配到的牛栏的数量. 分析:直接二分图匹配: #include<stdio.h> #includ ...

  6. POJ 2446 Chessboard (二分图匹配)

    题意 在一个N*M的矩形里,用1*2的骨牌去覆盖该矩形,每个骨牌只能覆盖相邻的两个格子,问是否能把每个格子都盖住.PS:有K个孔不用覆盖. 思路 容易发现,棋盘上坐标和为奇数的点只会和坐标和为偶数的点 ...

  7. [poj] 3057 Evacuation

    原题 题目大意 墙壁"X",空区域(都是人)".", 门"D". 人向门移动通过时视为逃脱,门每秒能出去一个人,人可以上下左右移动,墙阻止移 ...

  8. POJ 3057 Evacuation(二分匹配)

    分析: 这是一个时间和门的二元组(t,d)和人p匹配的问题,当我们固定d0时,(t,d0)匹配的人数和t具有单调性. t增加看成是多增加了边就行了,所以bfs处理出p到每个d的最短时间,然后把(t,d ...

  9. POJ 3057 Evacuation 二分+最大流

    Evacuation 题目连接: http://poj.org/problem?id=3057 Description Fires can be disastrous, especially when ...

随机推荐

  1. 使用ab进行压力测试

    在Windows系统的命令行下,进入ab.exe程序所在目录,执行ab.exe程序.注意直接双击无法正确运行.

  2. Android 6.0权限适配

    targetSdkVersion 23以上,必须适配新的权限模式 安卓6.0及之后,权限分为三类  1.不涉及隐私的正常权限,如innernet2.危险权限 3.特殊权限 system_alert_w ...

  3. Sublim Text3快捷键大全

    Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件Ctrl+Shift+V:粘贴并格 ...

  4. [Altera]PLL仿真

    EDA Tools: 1.Quartus II 13.1(64-bit) 2.Modelsim SE-64 10.1c Time: 2016.05.05 ----------------------- ...

  5. gcc 使用 stdio.h

    9876543210z@z:~/funnyC++$ cat main.cpp #include <stdio.h> int main() { ; ) { printf("%d&q ...

  6. 刚看到的感觉会用的到 收藏一下 常用的iOS第三方资源 (转)

    原文出处:http://blog.csdn.net/ruiwang321/article/details/50591888 一:第三方插件 1:基于响应式编程思想的oc 地址:https://gith ...

  7. [转载] 深入理解Android之Java虚拟机Dalvik

    本文转载自: http://blog.csdn.net/innost/article/details/50377905 一.背景 这个选题很大,但并不是一开始就有这么高大上的追求.最初之时,只是源于对 ...

  8. 9×9扫雷游戏代码-C写的

    #include <stdio.h> #include <stdlib.h> //画棋盘 a雷表 b周围雷数表 c打开表 ][],][],][]) { ,j=; ;i<; ...

  9. java 中如何声明线程安全的集合 set, map 和list

    线程安全的集合 http://blog.sina.com.cn/s/blog_508938e10102v1ig.html //make thread-safe list List MyStrList ...

  10. 通过XmlHttpRequest实现带进度条异步下载文件

    本博文源自技术群的讨论,因为网上找不到实现这样效果的的代码,而我说没问题,可以实现,因此有人质疑我是否能做到,呵呵,现将我实现代码贴出如下,希望有兴趣的同学可以继续完善: 本代码仅做技术展现,请勿探讨 ...