此题目的链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232点击打开链接
这道题是关于并查集的一道经典例题
并查集的几求解:实际上就是个不断更新的过程。
此题的代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int pre[1100]; //找寻其的俗称爸爸; int finds(int x) { if(x==pre[x]) { return x; } return x=finds(pre[x]); } //把两个输入中的数据关联起来: void unions(int x,int y) { int x1=finds(x); int x2=finds(y); if(x1!=x2) { pre[x1]=x2; } } int main() { int n,m; while(cin>>n) { if(n==0) { break; } cin>>m; //初始化把自己当做自己的爸爸; for(int i=1;i<=n;i++) { pre[i]=i; } int a,b; while(m--) { cin>>a>>b; unions(a,b); } int ans=0; for(int i=1;i<=n;i++) { //没有找到自己的爸爸得有多少; if(pre[i]==i) { ans++; } } cout<<ans-1<<endl; } return 0; }