规整一点,将各个步骤写成函数,所以函数调用浪费了时间
#include using namespace std; //union_find //水题,先把每人看成一个社团,然后合并一个,减一就好 int father[50005]; int ans; void init(int n) { for(int i = 1; i<=n; ++i) father[i] = i; } int find(int x) { return x==father[x]?x:father[x]=find(father[x]); } void merge(int a,int b) { int x = find(a); int y = find(b); if(x!=y) { ans--; father[x] = y; } } int main() { int n,m; int k = 1; int a,b; while(~scanf("%d%d",&n,&m),n) { init(n); ans = n; for(int i = 1; i<=m; ++i) { scanf("%d%d",&a,&b); merge(a,b); } printf("Case %d: %d\n",k++,ans); } return 0; }