给定有向多图的邻接列表表示是否有O(V + E)算法将其转换为无向简单图?该算法显然应该使用最小的空间。
答案 0 :(得分:1)
[编辑6/5/2013:将[]始终视为2D数组。]
是的,只要列出的每个邻接中的顶点按排序顺序排列,并且在一对顶点之间最多只能有一个边。假设顶点i的第j个子节点是[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个已排序的子序列 - 子顶点的原始列表(删除了任何更高的顶点),可能后跟从高顶点的邻接列表附加的父顶点列表。通过查找小于前一个元素的第一个元素,可以在线性时间中找到第二个序列的开始;如果找到,则两个子序列可以使用相同大小的缓冲区在线性时间内合并(或者使用没有额外空间的对数线性时间排序,或者使用桶排序和对数额外空间按线性时间排序)。没有邻居可以出现两次以上,并且在合并期间可以删除任何重复的邻居。