HLG1073

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章