#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
猜你喜欢
转载自guess-ya.iteye.com/blog/2057223
今日推荐
周排行