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

| 我只想确保这行得通。您能使用Dijkstra算法找到最大的路径吗?您是否必须先将距离初始化为类似于-1的距离,然后更改Relax子例程以检查其是否更大? 这是针对不会带来任何负面影响的问题。 这实际上是问题所在:   假设您得到一个电话网络图,它是一个图       G的顶点表示开关中心,并且其边缘表示通信       两个中心之间的线。边缘以其最低带宽标记       带宽边缘。给出一个算法,给定一个图和两个开关居中       和b,将输出a和b之间路径的最大带宽。 这行得通吗? 编辑: 我确实发现了这一点:   提示:基本子例程与Dijkstra中的放松子例程非常相似。   假设我们有一条边(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)},比我们目前拥有的要多)。 但是,由于初始化时所有距离都是无限的,因此无法完全确定这是什么意思。所以,我不知道这将如何工作。有什么线索吗?     
已邀请:
我不确定Djikstra的路要走。负负重对Djikstra来说是坏事,也是坏事。 我认为您可以按边缘权重进行排序,然后开始删除权重最低的边缘(最严重的瓶颈),然后查看图表是否仍处于连接状态(或至少是起点和终点)。当您知道您已消除瓶颈时,便可以断开图表,您可以查看该边缘的值来获取带宽。 (如果我没记错的话,每次迭代都需要O(E)时间,您将需要O(E)迭代才能找到瓶颈边缘,因此这是O(E2)算法。 编辑:您必须意识到最大的路径不一定是最高的带宽:您正在寻求最大化
min({edges in path})
而不是
sum({edges in path})
的值。     
您可以通过修改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();
这可能不是计算带宽的最有效方法,但是我现在可以想到。     
计算流量可能更适用,但是流量允许使用多个路径。     
只需反转边缘权重即可。也就是说,如果边缘权重为d,则将其视为d ^ -1。然后像往常一样做Dijkstra。像平常一样初始化所有到无穷远的距离。     
您可以使用Dijkstra的算法来查找一条最长路径,但是由于只有两个交换中心,因此我不明白为什么需要像Dijkstra那样访问每个节点。最喜欢的是一种更优化的方式,例如分支定界算法。     
您可以调整算法AllPairsShortestPaths(Floyd-Warshall)中的某些逻辑吗? http://www.algorithmist.com/index.php/Floyd-Warshall%27s_Algorithm 将未连接的边初始化为负无穷大,而不是取距离的最小值取最大值?     

要回复问题请先登录注册