1. 程式人生 > >並查集模板(C++版)

並查集模板(C++版)

最簡單的並查集 hdu1232

#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN=1050;
int p[MAXN];
int n,m;
void init(){
    for(int i=1;i<=n;i++){
        p[i]=i;
    }
}
int find(int x){
    return p[x]==x ? x : p[x]=find(p[x]);
}
void unit(int a,int
b){ p[find(a)]=find(b); } bool isUnit(int a,int b){ return find(a)==find(b); } int main(void){ while(~scanf("%d",&n) && n){ scanf("%d",&m); init(); int u,v; //n個節點如果都不連通,需要加n-1條邊 int res=n-1; for(int i=0;i<m;i++){ scanf
("%d%d",&u,&v); //如果有兩個節點連通的話,需要的邊就少了一條 if(!isUnit(u,v)){ res--; //再把這兩個點連通 unit(u,v); } } printf("%d\n",res); } return 0; }