Dijkstra的算法找到最多加权路径

时间:2011-04-18 03:52:50

标签: graph dijkstra longest-path

我只想确保这样做。你能找到使用Dijkstra算法的最佳路径吗?你是否必须首先将距离初始化为-1,然后更改relax子程序以检查它是否更大?

这是针对不会有任何负面影响的问题。

这实际上是问题所在:

  

假设您有一张电话网络图表,这是一张图表       G的顶点表示交换中心,其边表示通信       两个中心之间的界线。边缘由其最低带宽标记       带宽边缘。给出一个算法,给出一个图和两个交换中心a       和b,将输出a和b之间路径的最大带宽。

这会有用吗?


编辑:

我确实找到了这个:

  

提示:基本子程序与Dijkstra中的子程序Relax非常相似。   假设我们有一个边缘(u,v)。如果min {d [u],w(u,v)}> d [v]然后我们应该更新   d [v]到min {d [u],w(u,v)}(因为从a到u再到v的路径有带宽   min {d [u],w(u,v)},这比我们目前的更多。

不完全确定这是什么意思,因为初始化时所有距离都是无穷大。所以,我不知道这是如何工作的。任何线索?

6 个答案:

答案 0 :(得分:1)

我不确定Djikstra是否可行。负重量对Djikstra来说是坏事,坏事。

我认为您可以按边缘权重排序,并开始删除最低权重边缘(最差的瓶颈),并查看图表是否仍然连接(或至少是您的起点和终点)。图表被破坏的时刻就是当你知道你已经取消了瓶颈时,你可以查看该边缘的值以获得带宽。 (如果我没有弄错,每次迭代需要O(E)时间,并且您将需要O(E)迭代来找到瓶颈边缘,因此这是一个O(E 2 )算法。

编辑:您必须意识到最佳路径不一定是最高带宽:您希望最大化min({edges in path})的价值,而不是sum({edges in path})

答案 1 :(得分:1)

您可以通过修改Dijkstra来轻松解决这个问题,以计算所有其他顶点的最大带宽。

您无需将起始顶点初始化为-1。

Algorithm: Maximum Bandwidth(G,a)

Input: A simple undirected weighted graph G with non -ve edge weights, and a distinguished     vertex a of G

Output: A label D[u], for each vertex u of G, such that D[u] is the maximum bandwidth available from a to u.


Initialize empty queue Q;
Start = a;
for each vertex u of G do,
   D[u] = 0;

for all vertices z adjacent to Start do{                              ---- 1

 If D[Start] => D[z] && w(start, z) > D[z] {
    Q.enqueue(z);
    D[z] = min(D[start], D[z]);
  }
}
If Q!=null {
   Start = Q.dequeue;
   Jump to 1

}

else
  finish();

这可能不是计算带宽的最有效方法,但它是我现在能想到的。

答案 2 :(得分:0)

计算流量可能更适用,但流量允许使用多个路径。

答案 3 :(得分:0)

只需反转边缘权重。也就是说,如果边权重是d,则将其视为d ^ -1。那么Dijkstra就像往常一样。正常地将所有距离初始化为无穷大。

答案 4 :(得分:0)

你可以使用Dijkstra的算法找到一条最长的路径,但由于你只有两个交换中心,我不明白为什么你需要像Dijkstra那样访问每个节点。大多数人都喜欢采用更优化的方式,例如分支定界算法。

答案 5 :(得分:0)

你能调整算法AllPairsShortestPaths(Floyd-Warshall)中的一些逻辑吗? http://www.algorithmist.com/index.php/Floyd-Warshall%27s_Algorithm

将未连接的边缘初始化为负无穷大而不是取最小距离取最大值?