畅通工程

畅通工程

http://www.nowcoder.com/questionTerminal/4878e6c6a24e443aac5211d194cf3913

思路

并查集求出有多少个连通分支即可,这几道并查集的题目都可以用模板解的,下面这个模板没有很完整,所以用的时候够用就行,并且其实不新建一个类也行,我只是想告诉大家整个并查集的逻辑。

#include<iostream>
#include<vector>
#include<numeric>

using namespace std;

class UF{
public:
    vector<int> fa;
    int comp_cnt;
public:
    UF(int n) : fa(n), comp_cnt(n){
        iota(fa.begin(), fa.end(), 0);
    }
    int findFa(int x){
        return x == fa[x] ? x : fa[x] = findFa(fa[x]);
    }
    void unite(int x, int y){
        x = findFa(x), y = findFa(y);
        if(x != y) {
            fa[y] = x; comp_cnt --;
        }
    }
};
int main(){
    int N, M;
    while(cin >> N >> M){
        UF uf(N);
        int x, y;
        for(int i = 0; i < M; i ++){
            cin >> x >> y;
            uf.unite(x - 1, y - 1);
        }
        cout << uf.comp_cnt - 1 << endl;
    }
    return 0;
}
算法题解 文章被收录于专栏

不定期更新一些算法题解,有什么问题可以随时留言~

全部评论

相关推荐

07-09 18:33
门头沟学院 Java
这么逆天每年都有人去???&nbsp;填多益网申就是大型的服从性测试
鲁大牛:辅导员在群里发了这个公司我就申了一下。网申居然要写当场开摄像头写两篇不少于三百字的作文。太逆天了
点赞 评论 收藏
分享
这算盘打的
程序员小白条:都这样的,都是潜规则,你自己说可以实习一年就行了,实习可以随便跑路的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务