倒序操作用并查集判断是否连通,新技能get√(其实以前就会了

  这题细节很多。。。搞得整个程序都是调试输出,几度看不下去想要重写

  并查集到现在大概掌握了两个基本用途:判断是否连通 / 路径压缩(上一篇blog)UPD:判断某个区间是否被覆盖

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<cstdio>
  5. #define ll long long
  6. using namespace std;
  7. const int dx[]={,,,-,},dy[]={,,,,-},maxn=;
  8. int n,m,china,india,T,q,fa[maxn],x[maxn],y[maxn];
  9. bool v[][],map[][],map2[][];
  10. char s[maxn];
  11. void read(int &k)
  12. {
  13. int f=;k=;char c=getchar();
  14. while(c<''||c>'')c=='-'&&(f=-),c=getchar();
  15. while(c<=''&&c>='')k=k*+c-'',c=getchar();
  16. k*=f;
  17. }
  18. int gf(int x){return fa[x]==x?x:fa[x]=gf(fa[x]);}
  19. int bh(int x,int y)
  20. {
  21. if(x==)return n*m+;
  22. if(x==n+)return n*m+;
  23. return (x-)*m+y;
  24. }
  25. void dfs(int x,int y)
  26. {
  27. v[x][y]=;
  28. for(int i=;i<=;i++)
  29. {
  30. int nx=x+dx[i],ny=y+dy[i];
  31. if(nx>n||nx<||ny>m||ny<)continue;
  32. if((!v[nx][ny])&&(!map[nx][ny])&&(!map2[nx][ny]))
  33. fa[gf(bh(nx,ny))]=gf(bh(x,y)),dfs(nx,ny);
  34. }
  35. }
  36. int main()
  37. {
  38. read(T);
  39. while(T--)
  40. {
  41. memset(v,,sizeof(v));
  42. memset(map,,sizeof(map));
  43. memset(map2,,sizeof(map2));
  44. read(n);read(m);china=n*m+;india=n*m+;
  45. for(int i=;i<=n;i++)
  46. {
  47. scanf("%s",s);
  48. for(int j=;j<m;j++)
  49. map[i][j+]=s[j]-'';
  50. }
  51. read(q);
  52. for(int i=;i<=q;i++)
  53. {
  54. read(x[i]);read(y[i]);
  55. x[i]++;y[i]++;
  56. map2[x[i]][y[i]]=;
  57. }
  58. for(int i=;i<=n*m+;i++)fa[i]=i;
  59. for(int i=;i<=m;i++)
  60. if((!map[][i])&&(!v[][i])&&(!map2[][i]))fa[gf(bh(,i))]=gf(china),dfs(,i);
  61. for(int i=;i<=m;i++)
  62. if((!map[n][i])&&(!v[n][i])&&(!map2[n][i]))fa[gf(bh(n,i))]=gf(india),dfs(n,i);
  63. for(int i=;i<=n;i++)for(int j=;j<=m;j++)
  64. if((!map[i][j])&&(!v[i][j])&&(!map2[i][j]))dfs(i,j);
  65. if(gf(china)==gf(india))printf("-1\n");
  66. else
  67. for(int i=q;i;i--)
  68. {
  69. map2[x[i]][y[i]]=;
  70. for(int j=;j<=;j++)
  71. if((!map[x[i]+dx[j]][y[i]+dy[j]])&&(!map2[x[i]+dx[j]][y[i]+dy[j]]))
  72. fa[gf(bh(x[i]+dx[j],y[i]+dy[j]))]=gf(bh(x[i],y[i]));
  73. if(gf(china)==gf(india))
  74. {
  75. printf("%d\n",i);
  76. break;
  77. }
  78. }
  79. }
  80. return ;
  81. }

hdu5652:India and China Origins(并查集)的更多相关文章

  1. hdu5652 India and China Origins(并查集)

    India and China Origins  Accepts: 49  Submissions: 426  Time Limit: 2000/2000 MS (Java/Others)  Memo ...

  2. hdu 5652 India and China Origins 并查集+二分

    India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  3. hdu 5652 India and China Origins 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题目大意:n*m的矩阵上,0为平原,1为山.q个询问,第i个询问给定坐标xi,yi,表示i年后这 ...

  4. hdu 5652 India and China Origins 并查集+逆序

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意:一张n*m个格子的点,0表示可走,1表示堵塞.每个节点都是四方向走.开始输入初始状态方格, ...

  5. hdu-5652 India and China Origins(二分+bfs判断连通)

    题目链接: India and China Origins Time Limit: 2000/2000 MS (Java/Others)     Memory Limit: 65536/65536 K ...

  6. 并查集(逆序处理):HDU 5652 India and China Origins

    India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  7. HDU 5652 India and China Origins(并查集)

    India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  8. HDU 5652 India and China Origins 二分+并查集

    India and China Origins 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5652 Description A long time ...

  9. HDU 5652 India and China Origins(经典并查集)

    特别经典的一个题,还有一种方法就是二分+bfs 题意:空间内n*m个点,每个点是0或者1,0代表此点可以走,1代表不能走.接着经过q年,每年一个坐标表示此点不能走.问哪年开始图上不能出现最上边不能到达 ...

随机推荐

  1. lesson 20 pioneer pilots

    lesson 20 Pioneer pilots driver pilot rider cyclist 骑自行车的人 介词后不加that cover + 距离 = travel 了一段距离 by su ...

  2. 前端开发工程师 - 02.JavaScript程序设计 - 第1章.基础篇

    第1章--基础篇 JS介绍 html 网页的内容:css 网页的样式:javascript 网页的行为 i.e. hello world <!DOCTYPE html> <html& ...

  3. 【sessionInfo】使用说明

    对象:sessionInfo 说明:会话类型操作,此对象是session与cookies的完善版,解决了session异常丢失及cookies文件大小的问题. 注意: 1)  访客的IP地址发生变化时 ...

  4. PNG和PVR之间互相转换的脚本

    项目经常会将png和pvr之间互相转换,这里mark一个脚本,会将当前目录下的文件全部批量转换 png转换成pvr @echo off path %path%;"C:\Program Fil ...

  5. ThreadLocal 线程的私有内存

    话说在<操作系统原理>这门课里面,我们学到了很多概念:进程.线程.锁.PV操作.读写者问题等等,大家还记得么?(估计有些概念早已忘记了吧,哈哈哈~) 其中关于进程.线程和锁的东西是我们平时 ...

  6. centos+nginx+redmine+gitosis安装指南

    说明 这篇文章我现在的主要目的是记录自己安装redmine和gitosis的过程,可能写的有些糙,请各位读者见谅.我会在后面的时间里逐渐完善细节.但我想,这已经是网上迄今为止国内最详细的nginx+r ...

  7. vuejs学习之 项目打包之后的首屏加载优化

    vuejs学习之 项目打包之后的首屏加载优化 一:使用CDN资源 我们在打包时,会将package.json里,dependencies对象里插件打包起来,我们可以将其中的一些使用cdn的方式加载,例 ...

  8. 阿里云搭建bind服务,外网ip不能用来解析问题解决

    options { listen-on port 53 { any; }; //端口开放any listen-on-v6 port 53 { ::1; }; directory "/var/ ...

  9. svn服务器 备份,迁移,部署方案

    这次做业务迁移,要从一个云厂商迁移到某云厂商,之前每天到全备svn排到用场了,需要搭建一个全新到svn服务并要做迁移,并实现我们开发机到时时代码同步 一.svn备份有很多种,优劣都不同,百度可查,我采 ...

  10. Python—集合(在我的世界,你就是唯一)

    一.概念与定义 集合类型与数学中集合的概念一致,即包含0个或多个数据项的无序组合. 元素不可重复,只能是固定数据类型元素. 集合(set)属于Python无序可变序列,使用一对大括号作为定界符,元素之 ...