这题是并查集,然后没有什么弯弯绕。
#include <cstdio> const int maxn=50005; int pre[maxn]; int find(int x) { if (pre[x]==x) return x; return pre[x]=find(pre[x]); } void unions(int a,int b) { int x=find(a); int y=find(b); if (x!=y) pre[x]=y; } int main() { int n,m,a,b,k=1; while (scanf("%d%d",&n,&m)&&m+n) { for (int i=0;i<=n;i++) { pre[i]=i; } while (m--) { scanf("%d%d",&a,&b); unions(a,b); } int cnt=0; for (int i=1;i<=n;i++) { if (pre[i]==i) cnt++; } printf("Case %d: %d ",k++,cnt); } return 0; }