抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

作用

  1. 寻找两个点是否联通

  2. 求最小生成树。

例题

  1. 每个人都知道自己的领导,问谁是最终的领导。

  2. 计算圈子总个数

思路

  1. 常规思路

    递归寻找上级,由上级再次寻找。直到无法找到上级为止。

    常用于在单树中寻找最高节点。

  2. 路径压缩

    孙节点和父节点直接挂载在爷节点之下。

    常用于计算不连通的树的个数。

代码

#include<iostream>
#include<cstdio>

using namespace std;

int pre[1000];

int unionSearch(int root) {
    int son, tmp;
    son = root;
    while (root != pre[root])
        root = pre[root];
    while (son != root) {
        tmp = pre[son];
        pre[son] = root;
        son = tmp;
    }
    return root;
}

int main() {
    int num, road, total, i, start, end, root1, root2;
    while (cin >> num >> road) {
        total = num - 1;
        for (i = 1; i <= num; ++i)
            pre[i] = i;
        while (road--) {
            cin >> start >> end;
            root1 = unionSearch(start);
            root2 = unionSearch(end);
            if (root1 != root2) {
                pre[root1] = root2;
                total--;
            }
        }
        printf("%d\n", total);
    }
    return 0;
}



博客内容遵循 [署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)
本站总访问量为 访客数为
本站使用 Volantis 作为主题