HDU 4619 Warm up 2 (并查集)

来源:互联网 发布:大襟绸缎面花棉袄淘宝 编辑:程序博客网 时间:2024/05/01 10:32
/*    并操作保证了没有环,n个元素组成的链只要去掉n/2个元素就不会相连*/#include<iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;int f[2010];int cnt[2010];int mfind(int x){    if(f[x]!=x)f[x]=mfind(f[x]);    return f[x];}void make(int a,int b){    int f1=mfind(a);    int f2=mfind(b);    if(f1!=f2)    {        f[f2]=f1;        cnt[f1]+=cnt[f2];    }}int main(){    int n,m,i,j;    vector<int>g[110][110];;    while(cin>>n>>m&&(n+m))    {        int N=n+m;        for(i=0;i<N;i++){            f[i]=i;            cnt[i]=1;        }        for(i=0;i<101;i++)        {            for(j=0;j<101;j++)g[i][j].clear();        }        int x,y;        for(i=0;i<n;i++)        {            cin>>x>>y;            g[x][y].push_back(i);            g[x+1][y].push_back(i);        }        for(i=n;i<N;i++)        {            cin>>x>>y;            g[x][y].push_back(i);            g[x][y+1].push_back(i);        }        for(i=0;i<101;i++)        {            for(j=0;j<101;j++)            {                if(g[i][j].size()==2)                {                    make(g[i][j][0],g[i][j][1]);                }            }        }        int ans=0;        for(i=0;i<N;i++){                if(f[i]==i){                    if(cnt[i]==1)ans+=1;                    else ans+=cnt[i]-cnt[i]/2;            }        }        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击