我只想确保这样做。你能找到使用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)},这比我们目前的更多。
不完全确定这是什么意思,因为初始化时所有距离都是无穷大。所以,我不知道这是如何工作的。任何线索?
答案 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
将未连接的边缘初始化为负无穷大而不是取最小距离取最大值?