#include<iostream>
#include<algorithm>
using namespace std;
int fa[10010];
int cha(int a) {
if (fa[a] != a)fa[a] = cha(fa[a]); //递归实现,路径压缩
return fa[a];
}
void bing(int a, int b) {
a = cha(a);
b = cha(b);
fa[a] = b; //a的师傅是b
}
int main() { //江湖开始:n个城市,相当于n个门派,两个城市相连,记为a的师傅为b
int n, m,ans=0,a,b;
while (cin >> n&&n) {
ans = 0;
cin >> m;
if (m == 0)cout << n - 1 << "\n";
else if (m == 1)cout << n - 2 << "\n";
else {
for (int i = 1; i <= n; i++) //初始化,假定每个人师傅就是自己
fa[i] = i;
for (int i = 1; i <= m; i++) {
cin >> a >> b;
bing(a, b);
}
for (int i = 1; i <= n; i++)
if (fa[i]==i)ans++; //师傅是自己的,说明是一个门派
cout << ans-1 << "\n";
}
}
return 0;
}
原文:https://www.cnblogs.com/52dxer/p/10470004.html