策略: 如题。
并查集:并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。 说白了就是点的合并与查询。
代码:
?
#include
#include
int fat[1005]; int f(int n){ if(fat[n] != n) fat[n] = f(fat[n]); else return fat[n]; } int main() { int n, m, i; while(scanf(%d, &n), n){ scanf(%d, &m); for(i = 1; i <= n; i ++) fat[i] = i; int a, b; while(m --){ scanf(%d%d, &a, &b); int x = f(a); int y = f(b); if(x != y){ //如果 a的祖先不等于b的祖先,就让b的祖先的祖先等于a的祖先,这样两个集合就合并成了一个 fat[y] = x; } } int ans = 0; for(i = 1; i <= n; i ++) if(fat[i] == i) ++ans; printf(%d , ans-1); } return 0; }
?