规整一点,将各个步骤写成函数,所以函数调用浪费了时间

#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;
}