algorithm - 从邻接表表示中删除重复顶点和自循环的图形算法

标签 algorithm graph

<分区>

给定一个有向多图的邻接表表示,是否有 O(V+E) 算法将其转换为无向简单图?该算法显然应该使用最小的空间。

最佳答案

[编辑 6/5/2013:始终将 a[] 视为二维数组。]

是的,只要列出的每个邻接内的顶点都按排序顺序排列,并且一对顶点之间最多只能有一条边。假设顶点 i 的第 j 个 child 是 a[i][j]:

# First make sure each edge appears only in the lower endpoint's adjacency list.
# We don't care if this duplicates vertices in a list.
For each vertex i:
    j = 1
    For each k from 1 to len(a[i]):
        a[i][j] = a[i][k]
        If a[i][k] > i:
            j = j + 1        # Only save space for edges to higher vertices

        If a[i][k] < i:
            Append i to a[a[i][k]]

    Adjust len(a[i]) to j - 1

在这一点上,每个邻接列表最多包含 2 个排序的子序列 -- 子顶点的原始列表(删除了任何更高的顶点),可能后跟从更高顶点的邻接列表附加的父顶点列表。通过寻找第一个小于前一个元素的元素,可以在线性时间内找到第二个序列的开始;如果找到,则可以使用相同大小的缓冲区在线性时间内合并这两个子序列(或在不使用额外空间的情况下在对数线性时间内排序,或使用桶排序和对数额外空间在线性时间内排序)。任何邻居都不能出现超过两次,任何重复的都可以在合并期间删除。

关于algorithm - 从邻接表表示中删除重复顶点和自循环的图形算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12825237/

相关文章:

algorithm - 需要清楚解释范围更新和范围查询二叉索引树

c# - 在 C# 屏幕上的圆上选取 X 点

algorithm - neo4j - 遍历结构来构建 XML

python - 将聚类结果绘制并可视化为网络图

linux - 我需要帮助来使用 gnuplot 创建图表

javascript - JavaScript 中是否有一种有效的算法可以在较大的数组集中查找不同数组的数量?

python - 使用三元搜索查找范围内的所有元素?

graph - msalacquireTokenSilent 失败,静默身份验证被拒绝

ajax - 如何在基于算法的无限滚动中防止重复

ios - 核心图的标注不跟随滚动