并查集
然而x_union还不是很懂
#include <iostream>
using namespace std;
int x_path[50005];
int x_root[50005];
int answer;
int find_set(int x)
{
if (x!=x_path[x]) {
x_path[x]=find_set(x_path[x]);
}
return x_path[x];
}
void union_x(int x,int y)
{
x=find_set(x);
y=find_set(y);
if (x==y) {
return;
}
answer--;
if (x_root[x]>x_root[y]) {
x_path[y]=x;
}
else
{
x_path[x]=y;
if (x_root[x]==x_root[y]) {
x_root[y]++;
}
}
}
int main() {
int count=0;
int m,n,i;
int x,y;
while (cin>>n>>m) {
count++;
if (m==0&&n==0) {
return 0;
}
for (i=0; i<n; i++) {
x_path[i]=i;
x_root[i]=0;
}
answer=n;
for (i=0; i<m; i++) {
cin>>x>>y;
union_x(x, y);
}
//Case 1: 1
cout<<"Case "<<count<<": "<<answer<<endl;
}
return 0;
}