我们有一个边带正权的有向图G(V,E),作为源顶点s,目标点T。此外,最短的s-t路径包括图中的每一个其他顶点。我需要计算s和t之间的交替最短路径距离,以防某些边e∈e被删除。我想设计一个O(e^2logV)算法,它计算图G\e中所有e∈e的最短S-T路径距离。最后的输出应该是一个大小为E的数组,其中edge E的条目应该包含G\E中最短的S-T路径距离。
考虑S-T路径(以下为“主干”),并按路径顺序对K个顶点进行编号,S为顶点1。
定义BBi-j为具有从原始路径的i到j的相邻顶点的子路径,包括中间的边。
由于G中的所有顶点都属于路径,所以G中的所有边都位于路径中两个不同的顶点之间,将EI->J命名为i到J的有向边。
从图中删除边,唯一相关的情况是当边是主干的一部分时,在所有其他情况下路径都不改变。
从主干网中删除边EI->J会破坏它,所以只有在这种情况下我们才需要找到替换,我们可以证明新的最小最短路径具有如下形式
作为练习的示范;-)
在替换之后,路径长度增加附加长度
Glossary:
- v(i) is the i-th vertex in the backbone
- e(i->j) is the edge going out from v(i) to v(j), in the following we only
consider edges e(i->j) with j>i, i.e. forward edges, singe backward
edges can never be part of the solution
- e(*->k), k>j is any edge in the BT terminating in v(k) where k is greater
than j, the first index is unspecified since edges in BT are only sorted
by destination vertex
- e(*->q), q<j is any edge in the BT terminating in v(q) where q is lower
than j, the first index is unspecified since edges in BT are only sorted
by destination vertex
- BT a binary search tree where we store "best" edges found during the
iteration, the unique key in BT is the destination vertex's index, so
we can store here at most one incoming edge per vertex, BT is initially
empty, during the iteration we buld it so that it has the additional
property that given two edges e(*->a) e(*->b) in BT, if a<b then also
AL(e(*->a)) < AL(e(*->b)); in fact BT is ordered at same time both
by destination index and additional length of the edge
BT invariants (thanks j_random_hacker): at all times, BT contains only edges that
1. could be used to form a new path if e(i->i+1) is deleted (because they
begin at i or before, and end at i+1 or after)
2. are not dominated by any other such edge. An edge e(i->j) dominates
another edge e(i'->j') if both j >= j' and AL(i->j) < AL(i'->j').
If edge x dominates edge y, it means that, for each edge-deletion yet
to be considered (e(i->i+1), e(i+1->i+2), etc.), any replacement path
that uses y can always be changed to a shorter path using x, so we don't
need to care about y
//On each iteration we'll search the solution for removal of edge e(i->i+1)
for each vertex v(i) in S-T in path order, excluding T
//Discard backward edges, since they can only increase the path length
for each edge e(i->j) going out from v(i) directed to a vertex v(j) with j>i excluding the backbone edge
calculate additional length AL(e(i->j))
search BT using j as key, looking for an egde e(*->k) with k >= j
if such an edge exists and AL(e(*->k)) <= AL(e(i->j))
discard the current edge (BT's second property requires that)
else
//The current edge is the best choice to reach v(j)
insert edge in BT (if k==j) discard e(*->k)
//Now me must check if the new edge can also replace previous
//ones in the BT to keep the second property valiud, for this we have
//to scan the BT in descending order and discard edges with AL >= than
//the current one
loop over edges e(*->q) in BT with q<j in descending order
if AL(e(*->q))>=AL(e(i->j))
discard e(*->q)
else
stop loop
endloop
end if
end for each edge
//Prune tree from useless edges
remove from BT all edges with j < i+1
if BT is empty
no solution
else
select the first edge(i'->j') in BT ==> this is the replacement edge with minimum additional cost, so distance is dist(S-T) + AL(e(i'->j'))
end for each vertex
注意,这个问题并不需要生成路径,而只需要计算距离,如果必须生成路径,那么复杂度就会增加,因为我们最多可以有E条长度为V的路径,那么O(E V)
在一个具有不同正边的无向图中,是否可能有一个MST与最短路径树没有公共边? 我一直试图引出不同的例子,但似乎这是不可能的。最短路径树中的最短路径边似乎也应该包括在MST中。
以下是消费税: 在某些图的问题中,顶点可以有权代替边的权或增加边的权。设Cv是顶点v的代价,C(x,y)是边(x,y)的代价。该问题涉及到在图G中寻找顶点a和顶点b之间的最便宜路径,路径的代价是该路径上遇到的边和顶点的代价之和。 (a)假设图中每条边的权重为零(而非边的代价为∞),假设所有顶点1≤V≤n(即所有顶点的代价相同),Cv=1。给出一个求从a到b最便宜路径的高效算法及其时间复杂度。 (b
给了我一个问题,上面写着: 给定一个具有整数权值(正负两种)的连通有向图,发展一种求两顶点之间最短路径的算法。 我想我可以使用最小生成树算法,比如Kruskal的算法,然后用Dijkstra的算法来证明,因为在MST中,每个顶点只有一条内边,Dijkstra的算法即使在负权值下也能工作。 这听起来像是共食吗? 附注。我很难证明MST包含有向图的每个顶点的最短路径。
(b)假设图的最小生成树是唯一的。无向图的最小生成树中一对顶点之间的路径一定是最短(最小权)路径吗? 我的回答是 (a)
问题内容: 我知道标题有点乱,但是我不知道如何更好地解释它。 我正在尝试做的是: 使用在文本文件中找到的图形,找到并打印从顶点A到顶点B的最短路径(最小顶点数量)。 注意:请使用广度优先搜索,而不是Dijkstra搜索。 我所拥有的: 一种有效的算法,将BFS应用于图形,但是没有实际打印出最短路径的好方法。 我很难 区分最短路径中的顶点与仅通过算法运行的顶点,而不是最短路径中的顶点。 例如:查找0
我有一张室内地图上的无向位置图。当给定一组顶点时,我要找到覆盖所有这些顶点的最短路径。图形包含52个顶点和150-250条边。 我能用什么最好的算法来找到最短的路径。请不要混淆这是一个旅行推销员的问题。它不需要覆盖所有节点,只需要覆盖给定的节点集。