您的位置:首页 > 其它

并查集模板

2013-11-02 22:42 405 查看
#include "stdio.h"
const int maxn = 1005;
int n,m;
int p[maxn],rank[maxn];
int find( int x )
{
if( p[x] == x )
return p[x];
else
{
return p[x] = find( p[x] );
}
}
void merge( int a,int b )
{
int x = find(a);
int y = find(b);
if( rank[x] > rank[y] )
{
p[y] = x;
}
else
{
p[x] = y;
if( rank[x] == rank[y] )
rank[y]++;
}
}
int main()
{
int i,a,b;
while( scanf("%d",&n)!=EOF,n )
{
scanf("%d",&m);
int ans=0;
for( i=1;i<=n;i++ )
{
p[i]=i;
rank[i] = 0;
}
for( i=1;i<=m;i++ )
{
scanf("%d%d",&a,&b);
merge( a,b );
}
for( i=1;i<=n;i++ )
{
if( p[i]==i )
ans++;
}
printf("%d\n",ans);    //连通分量数
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: