#include <iostream>
#define N 50005
using namespace std;
int fa[N]; ///定義N個父節點
int num[N]; ///用於記錄每組有多少個對象
void init(int n){
for(int i = 0; i < n; ++i)
{
fa[i] = i; ///初始化每個對象的父節點是它本身
//num[i] = 1; ///每組的對象自然初始化爲 --1
}
}
int find(int u)
{
///找此對象的祖先
if(fa[u] != u)
{
fa[u] = find(fa[u]); ///如果當前不是他的祖先,就一直遞歸的找下去
}
return fa[u]; ///當找到他的祖先後返回祖先
}
void unin(int u, int v)
{
int fau = find(u); ///找對象u 的祖先將其值賦給 fau
int fav = find(v); ///同上
if(fau == fav) return ; ///如果u和v 是同一祖先 函數結束
fa[fav] = fau; ///如果u和v 不是同一祖先 因爲題目所說,他兩現在有
///關係了,自然他們的祖先應該統一了
//num[fau] += num[fav]; ///將兩組成員合併
//num[fav] = 0;
///自然將其一清零
}
int main()
{
int n, m;
int x, y;
int cut;
while(cin >> n >> m)
{
init(n);
while(m--)
{
cin >> x >> y;
unin(x, y);
}
cut = 0;
int f0 = find(0);
for(int i = 0; i < n; ++i)
if(f0 == find(i))
cut++;
cout << cut << endl;
}
return 0;
}
HLG1073
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.