只要最后统计出有多少个集合就好了
我用并查集还有set做的,好像用set慢了一点
#include<stdio.h> #include<set> using namespace std; int f[1010]; int find(int x) { if(x==f[x]) return f[x]; f[x]=find(f[x]); return f[x]; } void Union(int x,int y) { int a=find(x); int b=find(y); if(a==b) return ; f[a]=b; return ; } int main() { int n,m,i; int a,b; while(scanf("%d",&n)&&n) { scanf("%d",&m); for(i=1;i<=n;i++) f[i]=i; for(i=1;i<=m;i++) { scanf("%d %d",&a,&b); Union(a,b); } set<int> s; for(i=1;i<=n;i++) { s.insert(find(i)); } printf("%d\n",s.size()-1); } return 0; }