您的位置:首页 > 其它

HDU 4619 Warm up 2 (并查集)

2014-03-27 12:21 330 查看
/*
并操作保证了没有环,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: