#include<iostream>
#define N 1005
#define FOR(i,s,t) for(int i=(s);i<=(t);i++)
using namespace std;
int n,m,sum;
int father[N];
void make_set()
{ FOR(i,1,n)
father[i]=i;
sum=n;
}
int find_set(int a)
{ /*while(a!=father[a])
a=father[a];
return a;
*/
return a==father[a]?a:father[a]=find_set(father[a]);
}
void Union_set(int &a,int &b)
{ int x=find_set(a);
int y=find_set(b);
if(x!=y)
{ father[y]=x;
sum--;
}
}
int main()
{ while(cin>>n&&n)
{ cin>>m ;
make_set();
FOR(i,1,m)
{ int a,b;
cin>>a>>b;
Union_set(a,b);
}
cout<<sum-1<<endl;
} return 0;
}
http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?cid=791&pid=1001&ojid=0
最新推荐文章于 2025-12-02 09:17:36 发布
本文详细介绍了并查集算法的基本概念、实现原理及其在解决实际问题中的应用。通过具体的代码示例,展示了如何使用并查集进行数据集合的管理和操作,包括合并集合、查找根节点等关键步骤。
5982

被折叠的 条评论
为什么被折叠?



