这道题一开始的思路不过严谨,忽略 了一种情况,悲剧,本想一次过的
这题不难,跟前面的某一到题目类似,不过不是求集合的元素个数,而是求有多少个集合
具体思路很简单,在代码中……
#include<stdio.h> #define MAXN 50010 int f[MAXN],r[MAXN],n,num; int find(int x) { if(x!=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)//若父节点相同,则表示都出现过了,不同,则表示有一个学生会被归入某一个集合中,所以num--; return ; num--; if(r[a]>r[b]) { f[b]=a; } else { f[a]=b; if(r[a]==r[b]) r[b]++; } } int main() { int n,m,i,c=0,a,b; while(scanf("%d %d",&n,&m)!=EOF &&(n||m)) { num=n; for(i=1;i<=n;i++) { f[i]=i; r[i]=0; } for(i=1;i<=m;i++) { scanf("%d %d",&a,&b); Union(a,b); } printf("Case %d: %d\n",++c,num); } return 0; }