在两个顶点之间的无向图中查找特定边
Posted
技术标签:
【中文标题】在两个顶点之间的无向图中查找特定边【英文标题】:Finding a specific edge in an undirected graph between two vertices 【发布时间】:2014-06-11 10:45:33 【问题描述】:我正在尝试使用图论编写一个抽象算法。
给定一个无向无权图 G=(V,E),两个顶点:m,n∈V 和一条特定边 e∈E。我想检查边 e 是否是 m 和 n 之间所有最短路径的一部分。
我的算法:
-
从 m 开始执行 BFS 扫描,直到到达 n。 \\O(V+E)
int temp
布尔 ret \\ O(1)
从 G 中取出边 e。\\O(1)
从 m 开始 BFS 扫描直到到达 n \\ O(V+E)
如果 d[n] = ∞, ret 如果 d[n] == temp, ret 如果 d[n] > temp, ret将边 e 返回到 G.\\O(1)
返回 ret时间复杂度分析: O(V+E)
内存分析: temp 和 ret 额外的 O(2)。
你说什么?它是正确的,还是您有一个时间复杂度更低的更好主意?
【问题讨论】:
【参考方案1】:不会是 O(V+E)。广度优先搜索中最坏的情况是每条边都已搜索完毕,此时如果尚未找到节点,则搜索失败。这使得这部分的复杂度为 O(|E|),因为这是主要的计算,所有其他的 O(1),复杂度为 O(|E|)。
【讨论】:
【参考方案2】:您的算法似乎是正确的,并且确实会发现 e
是否参与了所有未加权最短路径。
证明:
如果e
在所有最短路径中-> 删除e
将否定这一切
路径 -> 新的最短路径将比旧路径更长 -> 算法得出正确答案。
如果e
没有参与某个最短路径(让它成为p
)-> 通过删除e
,路径p
仍然存在,因此从m
到n
的最短距离保持不变 -> 算法得出正确答案。
然而,你的记忆分析是错误的。
BFS 需要 O(V)
额外空间,用于访问集 - 所以额外空间是 O(V)
【讨论】:
以上是关于在两个顶点之间的无向图中查找特定边的主要内容,如果未能解决你的问题,请参考以下文章