并查集的模板函数

#include <iostream>
#include <cstdio>
#include <cstring>
int n,m,ans,p[1010];
void Make(int *a){for(int i=1;i<=n;i++)p[i] = i;}//每个点都是独立的
int Find(int x){return x==p[x]?x:(p[x]=Find(p[x]));//寻找i的父节点
void Union(int x,int y){p[Find(x)]=Find(y); }//合并x,y

int main(){
    while (scanf("%d %d", &n, &m) != EOF && n){
        Make(p);
        while(m--){
            int x,y;
            scanf("%d%d",&x,&y);
            Union(x,y);
        }
        ans=0;
        for(int i=1;i<=n;i++)
            if(Find(i)==i)ans++;
        printf("%d\n",--ans);
    }
    return 0;
}


Make,Find,Union是并查集中最基础三个必要的函数。

原文地址:https://www.cnblogs.com/beibeibao/p/3036509.html