並查集模板(C++版)
阿新 • • 發佈:2018-12-19
最簡單的並查集 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;
}