并查集判断连通块个数

#include  
using namespace std;  

int  pre[1050];     //保存节点的直接父节点

//查找x的根节点 
int find(int a){  
    if(pre[a]!=a)  
        pre[a]=find(pre[a]);//路径压缩,本结点更新为根结点的子结点  
    return pre[a];  
} 
//连接两个连通块
void join(int x,int y) {  
    int fx=Find(x),fy=Find(y);  
    if(fx!=fy) pre[fy]=fx;  
}   

int main() {  
    int N,M,a,b,i,j,ans=0;  
    while(scanf("%d%d",&N,&M) && N) {
        //初始化pre数组
        for(i=1;i<=N;i++) pre[i]=i;  
        //根据连通情况,构建pre数组
        for(i=1;i<=M;i++) {  
            scanf("%d%d",&a,&b);  
            join(a,b);
        }  
    for(i=1;i<=N;i++) 
        if(pre[i]==i) ans++; //计算连通子图的个数ans

    cout<return 0;  
}

你可能感兴趣的:(模板)