给出以下有向加权图,如何找到在B中开始和结束的最短路径?
我正在尝试Dijkstra,并且存在路径和不存在路径的两种情况都运行良好,但是找不到用于解决我上面所问情况的示例。
到目前为止,这是我的代码
INSERT INTO mytable
SELECT *
FROM dbo.agente
FULL JOIN dbo.cte
ON dbo.agente.agente = dbo.cte.agente
FULL JOIN dbo.cteenviara
ON dbo.agente.agente = dbo.cteenviara.agente
FULL JOIN dbo.unidad
ON dbo.cteenviara.unidad = dbo.unidad.unidad
FULL JOIN dbo.venta
ON dbo.agente.agente = dbo.venta.agente
FULL JOIN dbo.ventad
ON dbo.agente.agente = dbo.ventad.agente
FULL JOIN dbo.art
ON dbo.ventad.articulo = dbo.art.articulo
FULL JOIN dbo.alm
ON dbo.venta.almacen = dbo.alm.almacen
答案 0 :(得分:2)
如果允许零长度路由:
如果按路线指的是长度> 0的路径:
从源代码运行Dijkstra,获取数组sp [],以便sp [x]存储 从源到x的最短路径(这是Dijkstra的常规用法)
现在考虑所有传入源的边。
假设边缘是x->权重为w
因此我们可以到达路径> 0长度且总重量为 sp [x] + w
从所有此类路线中选择至少一个。
答案 1 :(得分:2)
做到这一点的规范方法是使用相同的传入和传出边缘和权重来复制(或“阴影”)节点B
(称为BB
)。
现在,应用Dijkstra的算法来查找从B
到BB
的最短路径。您已经有了该代码(即“我们现在已将问题减少到以前已解决的问题”)。
答案 2 :(得分:2)
将节点分为两个节点:
S
保留所有传出的边缘D
保留所有传入边缘现在通常可以将S
作为源,将D
作为目的地。
答案 3 :(得分:1)
您对该算法的实现非常慢,但是可以运行。如果要搜索从节点到其自身的> 0路径,则可以像这样更改初始化:
sign2