分析

这是一个时间和门的二元组(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. [CentOS7] at, bash, cron, anacron

    声明:本文主要总结自:鸟哥的Linux私房菜-第十五章.例行性工作排程(crontab),如有侵权,请通知博主 at => /var/spool/at /etc/at.allow, /etc/a ...

  2. Struts2练习

    首先从下载的Struts2中apps文件夹下选中需要联系的示例,拷贝jar包到eclipse项目WEB-INF/lib目录下,然后构建路径

  3. thinkphp5.1常量定义使用

    thinkphp5.1取消了系统常量 可以把常量配置在app.php文件中 //配置网站地址 'WEB_URL'=>'http://127.0.0.1/tp5', 可以使用config()函数直 ...

  4. day22作业详解

    1.面向对象作业1 2.作业详解 点击查看详细内容 #1. class Li(object): def func1(self): print('in func1') obj = Li() obj.fu ...

  5. Jmeter ExcelDataPreProcessor

    Jmeter的预处理器主要是用来在采样器(sample)被执行之前做一些额外的工作,比如参数化等等. 本文写一个例子来说明如何增加一个预处理器,需求如下:我们想在执行采样器前读取Excel文件中的数据 ...

  6. Unity [Tooltip("")]

    把Ad2Controller脚本挂在Ad2Ad3Manager游戏对象上,在非运行状态下把鼠标放在inspector的AdButtonObj2上就会显示广告2按钮. 如下图:

  7. No lease on /目录: File does not exist. [Lease. Holder: DFSClient_NONMAPREDUCE_-2059237550_1, pendingcreates: 8]错误及解决方法

    感觉程序员的世界真是一个变幻无常且精彩绝伦的世界,每次跑程序都会发现不一样的问题.今天跑MapReduce程序来统计邮箱次数时遇到了一个问题,明明一样的代码,别人能跑,我却跑不了.我相信,基本做这行的 ...

  8. 【密码学】DES、3DES

    文章1: 这一篇文章要解决数据加密——数据补位的问题.DES算法的两种模式ECB和CBC问题以及更加安全的算法——3DES算法. 一.数据补位 DES数据加解密就是将数据按照8个字节一段进行DES加密 ...

  9. Vue.extend动态注册子组件

    写本篇文章之前其实也关注过vue中的一个关于加载动态组件is的API,最开始研究它只是用来实现一个tab切换的功能,使用起来也蛮不错的. is 预期:string | Object (组件的选项对象) ...

  10. HDU 5505——GT and numbers——————【素数】

    GT and numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...