我们必须在图表中找到从源到汇的路线,其中最大成本边缘和最小成本边缘之间的差异最小。
我尝试使用递归解决方案,但它会在循环和修改后的dijkstra条件下失败。
是否有一种算法,我不必找到所有路线,然后找到最小值?
答案 0 :(得分:0)
好的,所以你有一个图表,你需要找到从一个节点(源)到另一个节点(接收器)的路径,这样路径上的最大边缘权重减去路径上的最小边缘权重最小化。你没有说明你的图表是否是定向的,可以有负边缘权重,还是有周期,所以我们假设所有这些问题的答案都是“是”。
当计算你的路径“得分”(边缘权重之间的最大差异)时,我们观察到它们与路径距离类似:你可以有一条从A到B的路径,它们得分更高(不合需要)或更低(理想)。如果我们将路径分数视为路径权重,我们观察到当我们通过添加新边来构建路径时,路径分数(=权重)只能增加:给定路径A-> B-> C,其中权重(A-> ; B)= 1并且权重(B-> C)= 5,产生路径分数为4,如果我将边缘C-> D添加到路径A-> B-> C,则路径分数可以只增加或保持不变:最小边缘重量和最大边缘重量之间的差值不会低于4.
所有这些的结论是我们可以探索图表寻找最佳路径,就像我们在没有负边缘的图形中寻找最佳路径一样。但是,可能(并且可能是,考虑到所描述的连接性)周期。这意味着,正确实施的Dijkstra's algorithm将具有相对于此图形拓扑的最佳性能,具体取决于我们今天所知。
有人可能误以为我们可以在不探索整个图的情况下做出关于哪条边应属于最佳路径的本地良好决策。以下子图说明了这个问题:
假设您需要从A到F的路径,并且您在节点B处。鉴于您知道的所有内容,您将选择C的路径,因为它最小化路径分数。您还不知道的是,该路径中的下一个边缘将导致该路径的分数显着增加。如果您知道您将选择边B-> D作为最佳路径中的下一个元素。
答案 1 :(得分:0)
按重量对边缘进行排序(按非递减顺序),然后对每个边缘执行下一个边缘:添加下一个边缘(按非递减顺序具有更大或相等权重的边缘),直到连接源和接收器,然后用最后一个边缘之间的差异更新你的答案,如下所示:
ans = INFINITE
for each Edge e1 in E (sorted by weight in non-decreasing order)
clear the temporal graph
for each Edge e2 in E
if e2.weight >= e1.weight
add e2 to the temporal graph
if sink and source are connected in the temporal graph
ans = min(ans, e2.weight - e1.weight)
break
print ans
如果使用UNION-FIND结构添加边缘并检查源和接收器之间的连接性,则应获得总时间为O(edge ^ 2)