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