分析

这是一个时间和门的二元组(t,d)和人p匹配的问题,当我们固定d0时,(t,d0)匹配的人数和t具有单调性。

t增加看成是多增加了边就行了,所以bfs处理出p到每个d的最短时间,然后把(t,d)和p连边,按t从小到大

枚举点增广就好了。无解的情况只有一种,某个人无论如何都无法出去。

  1. /*********************************************************
  2. * --Sakura hirahira mai orite ochite-- *
  3. * author AbyssalFish *
  4. **********************************************************/
  5. #include<cstdio>
  6. #include<iostream>
  7. #include<string>
  8. #include<cstring>
  9. #include<queue>
  10. #include<vector>
  11. #include<stack>
  12. #include<vector>
  13. #include<map>
  14. #include<set>
  15. #include<algorithm>
  16. #include<cmath>
  17. using namespace std;
  18.  
  19. typedef long long ll;
  20.  
  21. const int XY = , MAX_D = , MAX_P = ;//..MAX_T
  22. char maz[XY][XY+];
  23.  
  24. const int maxv = MAX_D*MAX_P, maxe = maxv*MAX_P;
  25. int hd[maxv],to[maxe],nx[maxe],ec;
  26. #define eachEage int i = hd[u]; ~i; i = nx[i]
  27. void add(int u,int v)
  28. {
  29. nx[ec] = hd[u];
  30. to[ec] = v;
  31. hd[u] = ec++;
  32. }
  33.  
  34. #define PB push_back
  35. #define resv(x,n) x.reserve(n);
  36. #define PS push
  37. vector<int> pX, pY, dX, dY;
  38.  
  39. const int dx[] = {,,-,}, dy[] = {,-,,};
  40.  
  41. int dist[XY][XY][XY][XY];
  42. int X,Y;
  43.  
  44. void bfs(int x,int y)
  45. {
  46. int (* const d)[XY] = dist[x][y];
  47. memset(d,0xff,sizeof(dist[x][y]));
  48.  
  49. queue<int> qx, qy;
  50. d[x][y] = ;
  51. qx.PS(x); qy.PS(y);
  52. while(qx.size()){
  53. x = qx.front(); qx.pop();
  54. y = qy.front(); qy.pop();
  55. for(int k = ; k--;){
  56. int nx = x+dx[k], ny = y+dy[k];
  57. if(<=nx && nx<X && <=ny && ny<Y && maz[nx][ny] == '.' && d[nx][ny]<){
  58. d[nx][ny] = d[x][y]+;
  59. qx.PS(nx); qy.PS(ny);
  60. }
  61. }
  62. }
  63. }
  64.  
  65. int link[MAX_P];
  66. int vis[maxv], clk;
  67.  
  68. bool aug(int u)
  69. {
  70. vis[u] = clk;
  71. for(eachEage){
  72. int v = to[i], w = link[v];
  73. if(w< || (vis[w] != clk && aug(w))){
  74. link[v] = u;
  75. return true;
  76. }
  77. }
  78. return false;
  79. }
  80.  
  81. //#define LOCAL
  82. int main()
  83. {
  84. #ifdef LOCAL
  85. freopen("in.txt","r",stdin);
  86. #endif
  87. resv(pX,MAX_P) resv(pX,MAX_P) resv(dX,MAX_D) resv(dY,MAX_D)
  88. int T; cin>>T;
  89. while(T--){
  90. scanf("%d%d",&X,&Y);
  91. pX.clear(); pY.clear();
  92. dX.clear(); dY.clear();
  93. for(int i = ; i < X; i++){
  94. scanf("%s", maz[i]);
  95. for(int j = ; j < Y; j++){
  96. if(maz[i][j] == 'D'){
  97. dX.PB(i); dY.PB(j);
  98. }
  99. else if(maz[i][j] == '.'){
  100. pX.PB(i); pY.PB(j);
  101. }
  102. }
  103. }
  104. int d = dX.size(), p = pX.size();
  105. if(p == ){ puts(""); continue; }
  106. for(int i = ; i < d; i++){
  107. bfs(dX[i],dY[i]);
  108. }
  109. int n = (X-)*(Y-);
  110. bool fail = false;
  111. memset(hd,0xff,sizeof(int)*n*d); ec = ;
  112. for(int i = ; i < p; i++){
  113. bool escape = false;
  114. for(int j = ; j < d; j++){
  115. if(dist[dX[j]][dY[j]][pX[i]][pY[i]] > ){
  116. if(!escape) escape = true;
  117. for(int k = dist[dX[j]][dY[j]][pX[i]][pY[i]]-; k < n; k++){
  118. add(k*d+j, i);
  119. }
  120. }
  121. }
  122. if(!escape){
  123. fail = true; break;
  124. }
  125. }
  126. if(fail){ puts("impossible"); continue; }
  127. memset(link,-,sizeof(int)*p);
  128. int cnt = , ans;
  129. for(int i = ; i < n*d; i++){
  130. clk++;
  131. if(aug(i) && ++cnt == p) {
  132. ans = i/d+;
  133. }
  134. }
  135. printf("%d\n", ans);
  136. }
  137. return ;
  138. }

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

  1. POJ 3057 Evacuation (二分匹配)

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

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

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

  3. POJ 3057 Evacuation 二分+最大流

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

  4. POJ 3057 Evacuation 二分图匹配

    每个门每个时间只能出一个人,那就把每个门拆成多个,对应每个时间. 不断增加时间,然后增广,直到最大匹配. //#pragma comment(linker, "/STACK:10240000 ...

  5. POJ 3057 Evacuation 题解

    题目 Fires can be disastrous, especially when a fire breaks out in a room that is completely filled wi ...

  6. POJ 3041 - 最大二分匹配

    这道题实现起来还是比较简单的,但是理解起来可能有点困难. 我最开始想到的是贪心法,每次消灭当前小行星最多的一行或一列.然而WA了.Discuss区里已经有高人给出反例. 下面给出正确的解法 我们把行和 ...

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

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

  8. 【最大匹配+二分答案】POJ 3057 Evacuation

    题目大意 POJ链接 有一个\(X×Y\)的房间,X代表墙壁,D是门,.代表人.这个房间着火了,人要跑出去,但是每一个时间点只有一个人可以从门出去. 问最后一个人逃出去的最短时间,如果不能逃出去,输出 ...

  9. poj 2446 Chessboard (二分匹配)

    Chessboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12800   Accepted: 4000 Descr ...

随机推荐

  1. Spark RDD(Resilient Distributed Dataset)

    基于数据集的处理:从物理存储上加载数据,然后操作数据,然后写入物理存储设备.比如Hadoop的MapReduce.        缺点:1.不适合大量的迭代  2. 交互式查询  3. 不能复用曾经的 ...

  2. ASP.NET控件之CompareValidator控件

    作用:对Textbox或者其他输入框进行比较验证: 属性:ControlToValidate:要验证的控件: ErrorMessage:错误提示信息: ControlToCompare:与此相比的控件 ...

  3. 洛谷P2294 [HNOI2005]狡猾的商人

    P2294 [HNOI2005]狡猾的商人 题目描述 输入输出格式 输入格式: 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要 ...

  4. 与pocket 对接技术文档

    同步每日新增用户接口(kwai 提供) 注释:该接口 每天0点(北京时间)之后 向kwai服务器同步前一天  新增的IMEI号 url:http://m.kwai.com/rest/o/pocket/ ...

  5. bzoj5506:[gzoi2019]旅行者

    传送门 正反两边dijkstra染色,然后枚举一下边,求出最小值就好啦 代码: #include<cstdio> #include<iostream> #include< ...

  6. vue2格式化时间戳

    注意:时间戳分为10位和13位的,10位的是秒,13位的是毫秒 这里给出的是格式化13位的方法,10位的时间戳可以加上3个0 <div id="app">{{time ...

  7. event对象的使用注意事项

    首先event是在事件发生的时候产生的,所以必须在事件发生的事件监听函数里面使用他.不然的话就没用的.会找不到这个事件: 错误的写法: 报错的内容: 正确的写法:

  8. sourcetree基本使用

    非常有用的使用sourcetree开发的步骤文档 https://www.cnblogs.com/fps2tao/p/7825742.html 1) master,最终发布版本,整个项目中有且只有一个 ...

  9. ubuntu设置nginx为系统服务

    ubuntu设置nginx为系统服务,如果没有设置为系统服务,无法执行 sudo service nginx startsudo service nginx stop 设置为系统服务命令 sudo u ...

  10. ZC01

    1.苏州市住房公积金管理中心 http://www.szgjj.gov.cn/szgjj/ 2.苏州社保 http://www.szsbzx.net.cn:9900/web/website/index ...