点击打开链接

并查集:

  1. #include<cstdio>
  2. #define N 505
  3. using namespace std;
  4. struct node
  5. {
  6. int x,y;
  7. };
  8. char map[N][N];
  9. node p[N*N];
  10. int turnx[4]={0,0,-1,1};
  11. int turny[4]={-1,1,0,0};
  12. int father[N*N];
  13. int rank[N*N];
  14. int find(int x)
  15. {
  16. if(father[x]!=x)
  17. father[x]=find(father[x]);
  18. return father[x];
  19. }
  20. void connect(int a,int b)
  21. {
  22. a=find(a);
  23. b=find(b);
  24. if(a!=b)
  25. {
  26. if(rank[a]>rank[b])
  27. father[b]=a;
  28. else if(rank[a]<rank[b])
  29. father[a]=b;
  30. else
  31. {
  32. father[a]=b;
  33. rank[b]++;
  34. }
  35. }
  36. }
  37. int main()
  38. {
  39. int T;
  40. int i,j;
  41. int n,m,q;
  42. int china,india;
  43. int dx,dy;
  44. scanf("%d",&T);
  45. while(T--)
  46. {
  47. scanf("%d%d",&n,&m);
  48. for(i=1;i<=n;i++)
  49. scanf("%s",map[i]+1);
  50. scanf("%d",&q);
  51. for(i=1;i<=q;i++)
  52. {
  53. scanf("%d%d",&p[i].x,&p[i].y);
  54. ++p[i].x,++p[i].y;
  55. map[p[i].x][p[i].y]='1';
  56. }
  57. for(i=1;i<=n*m+2;i++)
  58. {
  59. father[i]=i;
  60. rank[i]=0;
  61. }
  62. china=n*m+1;
  63. india=n*m+2;
  64. for(i=1;i<=m;i++)
  65. {
  66. if(map[1][i]=='0')
  67. connect(i,china);
  68. if(map[n][i]=='0')
  69. connect((n-1)*m+i,india);
  70. }
  71. for(i=1;i<=n;i++)
  72. {
  73. for(j=1;j<=m;j++)
  74. {
  75. if(map[i][j]=='0')
  76. {
  77. if(i<n&&map[i+1][j]=='0')
  78. connect(i*m+j,(i-1)*m+j);
  79. if(j<m&&map[i][j+1]=='0')
  80. connect((i-1)*m+j+1,(i-1)*m+j);
  81. }
  82. }
  83. }
  84. if(find(china)==find(india))
  85. {
  86. printf("-1\n");
  87. continue;
  88. }
  89. for(i=q;i>0;i--)
  90. {
  91. map[p[i].x][p[i].y]='0';
  92. if(p[i].x==1)
  93. connect(p[i].y,china);
  94. if(p[i].x==n)
  95. connect((n-1)*m+p[i].y,india);
  96. for(j=0;j<4;j++)
  97. {
  98. dx=p[i].x+turnx[j];
  99. dy=p[i].y+turny[j];
  100. if(dx>0&&dx<=n&&dy>=0&&dy<=m&&map[dx][dy]=='0')
  101. connect((dx-1)*m+dy,(p[i].x-1)*m+p[i].y);
  102. }
  103. if(find(china)==find(india))
  104. break;
  105. }
  106. printf("%d\n",i);
  107. }
  108. return 0;
  109. }

BFS+二分:

  1. #include<cstdio>
  2. #include<queue>
  3. #include<cstring>
  4. #include<stack>
  5. using namespace std;
  6. int n,m;
  7. char map[510][510];
  8. int visit[510][510];
  9. int turnx[4]={1,-1,0,0};
  10. int turny[4]={0,0,1,-1};
  11. struct node
  12. {
  13. int x;
  14. int y;
  15. };
  16. node u[300000];
  17. int yes(int x,int y)
  18. {
  19. if(x<0||y<0||x>n+1||y>=m||map[x][y]=='1')
  20. return 0;
  21. return 1;
  22. }
  23. queue<node> s;
  24. int bfs()
  25. {
  26. int i;
  27. node p,q;
  28. p.x=0;
  29. p.y=0;
  30. visit[p.x][p.y]=1;
  31. s.push(p);
  32. while(!s.empty())
  33. {
  34. p=s.front();
  35. s.pop();
  36. if(p.x==n+1&&p.y==0)
  37. {
  38. while(!s.empty())
  39. s.pop();
  40. return 1;
  41. }
  42. for(i=0;i<4;i++)
  43. {
  44. q=p;
  45. q.x+=turnx[i];
  46. q.y+=turny[i];
  47. if(!visit[q.x][q.y]&&yes(q.x,q.y))
  48. {
  49. visit[q.x][q.y]=1;
  50. s.push(q);
  51. }
  52. }
  53. }
  54. return 0;
  55. }
  56. int main()
  57. {
  58. int T,Q,i,begin,end,mid;
  59. scanf("%d",&T);
  60. while(T--)
  61. {
  62. while(!s.empty())
  63. s.pop();
  64. scanf("%d%d",&n,&m);
  65. for(i=0;i<m;i++)
  66. {
  67. map[0][i]='0';
  68. map[n+1][i]='0';
  69. }
  70. memset(visit,0,sizeof(visit));
  71. for(i=1;i<=n;i++)
  72. scanf("%s",map[i]);
  73. scanf("%d",&Q);
  74. for(i=1;i<=Q;i++)
  75. {
  76. scanf("%d%d",&u[i].x,&u[i].y);
  77. ++u[i].x;
  78. }
  79. begin=1;
  80. end=Q;
  81. while(begin<=end)
  82. {
  83. mid=(begin+end)/2;
  84. memset(visit,0,sizeof(visit));
  85. for(i=begin;i<=mid;i++)
  86. map[u[i].x][u[i].y]='1';
  87. for(i=mid+1;i<=end;i++)
  88. map[u[i].x][u[i].y]='0';
  89. if(bfs()==1)
  90. begin=mid+1;
  91. else
  92. end=mid;
  93. if(begin==end)
  94. {
  95. mid=begin;
  96. break;
  97. }
  98. }
  99. printf("%d\n",mid);
  100. }
  101. return 0;
  102. }

(并查集 or BFS+二分)HDU5652的更多相关文章

  1. 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路

    题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...

  2. 求树的直径+并查集(bfs,dfs都可以)hdu4514

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...

  3. 【CF659F】Polycarp and Hay(并查集,bfs)

    题意: 构造一个矩阵,使得: 矩阵所有格子中数字都小于等于原矩阵,并且至少有一个元素和原矩阵相等, 构造的矩阵除了0以外的数字必须联通并且相等,矩阵中元素之和为K. n,m<=1e3,1< ...

  4. [Bzoj1821][JSOI2010]Group 部落划分 Group(并查集)(二分答案)

    1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2949  Solved: 1392[S ...

  5. hdu 4750 Count The Pairs(并查集+二分)

    Problem Description With the 60th anniversary celebration of Nanjing University of Science and Techn ...

  6. 并查集+二分-hdu-4750-Count The Pairs

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4750 题目大意: 给一无向图,n个点,m条边,每条边有个长度,且不一样.定义f(i,j)表示从节点i ...

  7. [CF1386C] Joker (IOI 赛制,分治,整体二分+可回退并查集)

    题面 给一个 N N N 点 M M M 边的简单无向图,询问 Q Q Q 次,每次问你把编号在 [ l i , r i ] [l_i,r_i] [li​,ri​] 之间的边删掉后,该图是否存在奇数环 ...

  8. HDU 1272 小希的迷宫 并查集

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. hdu 5652 India and China Origins(二分+bfs || 并查集)BestCoder Round #77 (div.2)

    题意: 给一个n*m的矩阵作为地图,0为通路,1为阻碍.只能向上下左右四个方向走.每一年会在一个通路上长出一个阻碍,求第几年最上面一行与最下面一行会被隔开. 输入: 首行一个整数t,表示共有t组数据. ...

随机推荐

  1. 学习HTML5之塔克大战(详细记录)

    学了一些HTML5的一些基本知识,开始学习制作...... 介绍一些基本知识:  px(像素)--->1px等于多少? 1cm or 2cm -->no  no no! (1).像素是一个 ...

  2. 企业级的响应式设计(Responsive design at enterprise level)译

    导言 响应式设计是现在人们谈论的热点,但如何部署,特别是在有多种设备的大型项目中如何组织响应式设计,响应式设计和可伸缩性(Scalable)有什么区别?这都是需要解决的难题. 优化用户经验——Opti ...

  3. Objective-C(二、类和对象)

     类和对象 #import是include的升级版,可以自动防止重复包含,所以注意:大家以后在引入头文件的时候都使用import Foundation是一个框架,Foundation.h是Founda ...

  4. C++构造函数和析构函数调用虚函数时都不会使用动态联编

    先看一个例子: #include <iostream> using namespace std; class A{ public: A() { show(); } virtual void ...

  5. jar转dll

    IKVM http://www.cnblogs.com/luckeryin/archive/2012/03/28/2421274.html

  6. BZOJ2721 [Violet 5]樱花

    先令n! = a: 1 / x + 1 / y = 1 / a  =>  x = y * a / (y - a) 再令 k = y - a: 于是x = a + a ^ 2 / k  => ...

  7. android 定制目录

    首先简单介绍一下安卓系统文件夹对照表 主要介绍的是Android系统的文件夹结构,帮助大家更直观地了解系统 \\system\\app这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结 ...

  8. Mongodb Management Studio

    1.服务器管理功能添加服务器,删除服务器 2.服务器,数据库,表,列,索引,树形显示和状态信息查看 3.查询分析器功能.支持select,insert,Delete,update支持自定义分页函数 $ ...

  9. 这是BUG吗?

    百度首页的控制台里,有一段招聘信息,想必大家都知道吧,点击里面的链接地址跳到了百度招聘页面然后就发现了这个:,如果这不是BUG的话,那用户体验真是不好

  10. 用for循环打印菱形

    package nothh; public class mmm { public static void main(String[] args) { //for循环内的 for按顺序运算,先打印1/4 ...