并查集 模板

来源:互联网 发布:兰芝淘宝旗舰店 编辑:程序博客网 时间:2024/04/25 12:46
//simple ways:并查集 union-find sets #include <cstdio>#include <iostream>using namespace std;int f[1000] = {0},n,m,k,sum = 0;bool isRoot[1000];void init() {for ( int i = 1; i <= n; i++ ) {f[i] = i;isRoot[i] = false;}}int getf(int v) {if ( f[v] == v ) return v;else {f[v] = getf(f[v]);return f[v];}}void merge(int v, int u) {int t1,t2;t1 = getf(v);t2 = getf(u);if ( t1 != t2 ) {f[t2] = t1;}}int main(){int x, y;scanf("%d %d",&n,&m);init();//输入数据 for ( int i = 1; i <= m; i++ ) {scanf("%d %d",&x,&y);merge(x,y);}for ( int i = 1; i <= n; i++ ) {isRoot[getf(i)] = true; }for ( int i = 1; i <= n; i++ ) {if ( isRoot[i] ) sum++;}cout << sum << endl;return 0;}

0 0