hdu5652 India and China Origins

来源:互联网 发布:思念是一种病 知乎 编辑:程序博客网 时间:2024/05/22 11:36

题意:在一个地图上 有山峰(1表示),中国印度在地图上下,在原有地图上增加一些山峰,问何时中国和印度不连通。
思路:开始想着每个操作后暴力图上上下点看是否连接,果然TLE。
正确解法是并查集,可以考虑从地图左边到右边是否出现一条路阻断联通,即 左边某点到右边某点是否有关系,就可以判断上下联通。

#include<bits/stdc++.h>using namespace std;const int N=510;int f[N*N],v[N][N],M[N][N],n,m;int F(int x) {return f[x]==x ? x: f[x]=F(f[x]);}void Merge(int x,int y) {if(F(x)!=F(y)) f[F(x)]=y;}void add(int x,int y){    int z=M[x][y];    for(int i=-1;i<=1;i++){        for(int j=-1;j<=1;j++){            if(v[x+i][y+j]==1) Merge(z,M[x+i][y+j]);        }    }    if(y==1) Merge(z,0);    if(y==m) Merge(z,1);    v[x][y]=1;}int main(){    int T;scanf("%d",&T);    while(T--){        int ans=-1;        memset(v,0,sizeof(v));        scanf("%d%d",&n,&m);        int cnt=1;        for(int i=1;i<=n;i++){            for(int j=1;j<=m;j++){                M[i][j]=++cnt;            }        }        for(int i=0;i<=cnt;i++) f[i]=i;        for(int i=1;i<=n;i++){           char s[N];scanf("%s",s+1);           for(int j=1;j<=m;j++){            if(s[j]=='1') add(i,j);           }        }        if(F(0)==F(1)) ans=0;        int Q;scanf("%d",&Q);        for(int i=1;i<=Q;i++){            int a,b;scanf("%d%d",&a,&b);            add(a+1,b+1);            if(ans==-1&&F(0)==F(1)) ans=i;        }        printf("%d\n",ans);    }}
0 0
原创粉丝点击