美文网首页
并查集距离

并查集距离

作者: madao756 | 来源:发表于2020-09-17 14:12 被阅读0次

之前一道笔试题考到了这个,现在我拿出来复习一下

0X00 基本解释

之前我们用并查集求的都是两点是不是在一个集合,现在我们要求一个集合的两点之间的距离。

这里的距离不是树上的距离:

看题 https://www.acwing.com/problem/content/240/ 就可以知道,合并两个集合的时候,我们是把一个集合拼在另外一个集合的尾部

所以本质上是一个链表,不过在并查集中我们使用的路径压缩使得,不需要遍历一遍就可以知道长度。

所以在一个集合中求两个点的距离,其实就是两个点到根节点的距离相减。

0X01 代码

https://www.acwing.com/problem/content/240/

from sys import stdin

def readline(n = 2):
    if n == 1:
        return stdin.readline().replace("\n", "")
    return stdin.readline().replace("\n", "").split()

N = 30010
p = [i for i in range(N)]
size = [1 for i in range(N)]
dist = [0] * N

m = int(readline(1))

def find(x):
    if p[x] != x:
        fa = find(p[x])
        # 它到原来根节点的距离 + 原来根节点到现在根节点的距离,路径压缩
        dist[x] += dist[p[x]]
        p[x] = fa
    return p[x]


for i in range(m):
    t = readline()
    op, x, y = t[0], int(t[1]), int(t[2])
    px, py = find(x), find(y)
    if op == "M":
        if px != py:
            # 原来根节点的距离等于合并的另一个集合的大小
            dist[py] = size[px]
            size[px] += size[py]
            p[py] = px
    else:
        if px != py:
            print(-1)
            continue
        print(max(0, abs(dist[x]-dist[y]) - 1))

相关文章

  • 并查集距离

    之前一道笔试题考到了这个,现在我拿出来复习一下 0X00 基本解释 之前我们用并查集求的都是两点是不是在一个集合,...

  • markdown学习

    #并查集 ##并查集的定义 ##并查集的操作

  • 算法模板(四)并查集

    并查集 路径压缩并查集

  • 并查集入门使用

    本文参考自《算法笔记》并查集篇 并查集的定义 什么是并查集?并查集可以理解为是一种维护数据集合的结构。名字中并查集...

  • 并查集练习

    并查集 参考《算法笔记》 三要素:并,查,集。 并差集与一个算法有关,kruskal算法,就可通过并查集实现。 1...

  • 并查集

    并查集 并查集是什么 并查集是一种用来管理元素分组情况的数据结构,并查集可以高效地进行如下操作: 查询元素a和元素...

  • 数据结构与算法(十二)并查集(Union Find)

    本文主要包括以下内容: 并查集的概念 并查集的操作 并查集的实现和优化Quick FindQuick Union基...

  • 并查集

    并查集是什么 并查集是一种用来管理元素分组情况的数据结构。并查集可以高效地进行如下操作。不过需要注意并查集虽然可以...

  • 并查集

    开始时让每个元素构成一个个单元素集合(注意初始化时应使每个元素各成一组)按照一定顺序将属于同一组元素所在的集合合并...

  • 并查集

网友评论

      本文标题:并查集距离

      本文链接:https://www.haomeiwen.com/subject/hpplyktx.html