这道题多了一个检查是否包含所有元素
可以设一个cnt表示集合里的数量,再与外面比较
#include <cstdio> #include <iostream> #include <queue> using namespace std; #define sf scanf #define pf printf #define debug printf("! ") #define blank printf(" ") #define mem(a,b) memset(a,b,sizeof(a)) const int MaxN = 50010; const int INF = 1<<27; int p[MaxN],a[MaxN]; bool vis[MaxN]; int m,n; int find(int x){return p[x]==x?x:p[x]=find(p[x]);} void Union(int x,int y) { int rx = find(x); int ry = find(y); p[rx] = ry; } int main() { int i,j,k,l,c=0; while(~sf("%d%d",&n,&m),n+m) { i = 0; c++; mem(p,0); mem(vis,false); for(i=1;i<=n;i++) p[i] = i; while(m--) { sf("%d%d",&k,&l); Union(k,l); } int cnt = 0; for(i = 1;i<=n;i++) { if(!vis[find(i)]) { vis[find(i)] = true; cnt++; } } pf("Case %d: %d ",c,cnt); } return 0; }