7_4_D题 India and China Origins题解 [hdu 5652](并查集)
来源:互联网 发布:利用淘宝店做淘宝客 编辑:程序博客网 时间:2024/05/21 10:17
题目链接
简单题意
如图所示,有一个矩阵,上面是China下面是India,矩阵中0(白块)代表可以通行,1(黑块)代表阻碍,四方向联通,每年会往矩阵中多加一个1的块,问哪一年China和India被分离了。
思路
使用并查集,倒着来做,每次删除一个黑块,然后将该块和和周围的块进行合并,判断China和India是否连通了;
代码
#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>using namespace std ;typedef long long ll;const int maxn = 505;int fa[maxn*maxn];int mov[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};int sav[maxn*maxn][2];char maze[maxn][maxn];bool vis[maxn][maxn];int n,m;void init(){ for(int i = 0 ; i <= n ; i ++){ for(int k = 0 ; k <=m ; k ++) fa[i*m+k] = i*m+k; }}const int ind = 1e9+7;const int chn = 1e9+8;int find(int x){ return fa[x] == x || fa[x] == ind || fa[x] == chn ? fa[x] :fa[x] = find(fa[x]);}bool Union(int x , int y,int nx,int ny){ int a = find(x*m+y); int b = find(nx *m +ny); if(a != b){ if(a > 1e9 && b > 1e9) return true; else { if(a > b) fa[b] = a; else fa[a] = b; } } return false;}bool dfs(int x,int y){ vis[x][y] = true; int nx,ny; for(int i = 0 ; i < 4 ; i ++){ nx = x + mov[i][0]; ny = y + mov[i][1]; if(nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == '0'){ if(Union(x,y,nx,ny)) return true; if(!vis[nx][ny]) dfs(nx,ny); } } return false;}int main (){ int T; while(~scanf("%d",&T)){ while(T --){ scanf("%d %d", &n,&m); getchar(); for(int i = 0 ; i < n ; i ++){ scanf("%s", maze[i]); memset(vis[i],0,sizeof(vis[i])); } int t; scanf("%d", &t); for(int i= 0 ; i < t; i ++){ int x,y; scanf("%d %d", &x,&y); sav[i][0] = x; sav[i][1] = y; maze[x][y] = '1'; } init(); for(int i = 0 ; i < m ; i ++){ fa[0*m+i] = ind; fa[(n-1)*m+i] = chn; } int ans = -1; for(int i = 0 ; i < m ; i ++){ if(maze[0][i] == '0') if(dfs(0,i)) ans = 0; if(maze[n-1][i] == '0') if(dfs(n-1,i)) ans = 0; } if(ans == -1){ for(int i = t-1 ; i >= 0 ; i --){ maze[sav[i][0]][sav[i][1]] = '0'; if(dfs(sav[i][0],sav[i][1])) ans = i+1; if(ans != -1) break; } } printf("%d\n", ans); } } return 0;}
0 0
- 7_4_D题 India and China Origins题解 [hdu 5652](并查集)
- HDU 5652 India and China Origins(并查集)
- hdu 5652 India and China Origins (并查集)
- HDU-5652 India and China Origins(并查集)
- HDU-5652 India and China Origins(并查集)
- HDU 5652 India and China Origins(并查集)
- hdu 5652 India and China Origins 并查集
- hdu 5652 India and China Origins 并查集+BFS
- 【HDOJ 5652】 India and China Origins(并查集)
- HDU 5652 India and China Origins (并查集判断联通)
- hdu5652 India and China Origins(并查集)
- 杭电5652 India and China Origins(并查集求是否连通)
- hdu5652 India and China Origins(并查集)
- 并查集 hdu5652 India and China Origins
- hdu5652 India and China Origins(并查集联通)
- hdu5652 India and China Origins(并查集)
- hdu 5652 India and China Origins(二分)
- hdu 5652 India and China Origins (★)
- 无限轮播图 三种实现方式
- 使用ivy管理jar包
- 如何在mac上安装gradle
- C语言的控制语句
- Java提高篇(三二)-----List总结
- 7_4_D题 India and China Origins题解 [hdu 5652](并查集)
- android小知识点ArrayList转String[]
- maven问题
- 支付宝错误码ILLEGAL_PARTNER_EXTERFACE
- 二叉排序树的结点删除
- Android MVP 模式--让你的代码更加清晰,给你的代码瘦身
- 使用GooSeeker软件进行爬虫
- LeetCode - 230. Kth Smallest Element in a BST
- MySQL索引类型总结和使用技巧以及注意事项