源和目标相同时的Dijkstra算法示例

时间:2019-04-03 17:52:40

标签: c# algorithm dijkstra

给出以下有向加权图,如何找到在B中开始和结束的最短路径?

我正在尝试Dijkstra,并且存在路径和不存在路径的两种情况都运行良好,但是找不到用于解决我上面所问情况的示例。

enter image description here

到目前为止,这是我的代码

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  

4 个答案:

答案 0 :(得分:2)

如果允许零长度路由:

  • 然后答案就是0。

如果按路线指的是长度> 0的路径:

  • 从源代码运行Dijkstra,获取数组sp [],以便sp [x]存储 从源到x的最短路径(这是Dijkstra的常规用法)

  • 现在考虑所有传入源的边。

  • 假设边缘是x->权重为w

  • 的源
  • 因此我们可以到达路径> 0长度且总重量为 sp [x] + w

  • 从所有此类路线中选择至少一个。

答案 1 :(得分:2)

做到这一点的规范方法是使用相同的传入和传出边缘和权重来复制(或“阴影”)节点B(称为BB)。

现在,应用Dijkstra的算法来查找从BBB的最短路径。您已经有了该代码(即“我们现在已将问题减少到以前已解决的问题”)。

答案 2 :(得分:2)

将节点分为两个节点:

  • 节点S保留所有传出的边缘
  • 节点D保留所有传入边缘

现在通常可以将S作为源,将D作为目的地。

答案 3 :(得分:1)

您对该算法的实现非常慢,但是可以运行。如果要搜索从节点到其自身的> 0路径,则可以像这样更改初始化:

sign2