并查集

集合

判断两个点是不是在一个集合里面
检查图中有多少个孤立节点
很多问题都可以抽象为集合问题

代码

在合并两个树的同时,进行路径压缩。让所有的节点指向根节点。

#include <iostream>
using namespace std;
int Tree[1001];
int N=1000;

//寻找根节点
int findRoot(int i){
    if (Tree[i]==-1){
        return i;
    }
    int root = findRoot(Tree[i]);
    Tree[i] = root; //路径压缩
    return root;
}

//合并两个集合
void unite(int i,int j){
    int root_i = findRoot(i);
    int root_j = findRoot(j);
    if (root_i!=root_j){
        Tree[root_i] = root_j;
        N--;
    }

}

int main(){
    int M;
    while (cin>>N>>M&&N){
        for (int i = 1; i <=1000 ; ++i) {
            Tree[i]=-1;
        }
        for (int i = 0; i <M ; ++i) {
            int x,y;
            cin>>x>>y;
            unite(x,y);
        }
        cout<<N-1<<endl;
    }
}

上面代码需要注意的地方:
Tree[root_i] = root_j;

阅读更多

扫码向博主提问

去开通我的Chat快问

nghuyong

非学,无以致疑;非问,无以广识
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nghuyong/article/details/70184096
个人分类: 算法
想对作者说点什么? 我来说一句

acm的数据结构内容

2010年04月23日 408KB 下载

朱全民-并查集ppt

2009年07月25日 103KB 下载

并查集初步

2012年12月01日 386KB 下载

并查集 第12章 并查集

2013年04月11日 338KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭