双向图的算法

时间:2011-04-26 23:21:22

标签: algorithm graph shortest-path minimum-spanning-tree

假设我有一个节点图(网络),权重如下: 1.在两个节点之间的链路上单向行驶 2.以另一种方式在两个节点之间的链路上行进(这些可能是不同的)。 3.从一个链接转换到另一个链接。

此外,有些节点只是单向的。

在这种情况下,最佳算法是: a)找到最小生成树 b)找到两个节点之间的最短路径 c)找到“旅行推销员”路径(即到处都是最短的路线,最小重复)?

另外,最好将双向物体视为两条单向路径,而不是每个方向具有不同权重的双向路径?

---一个例子---

              3
  A --<2/3>-- B --<3/2>-- C
  | 1        2|3
  |           |
  ^1/4       ^4/3
  |           |
  |3         4|
8 D --<3/5>-- E
  |2
  |
1 ^3/1
  |
  |
  F

其中&lt; 2/3&gt;表示左侧行驶2次,右侧行驶3次。 ^ 1/4表示1个旅行,4个旅行。两个链接之间的单个数字是更改链接的成本 - 例如从AD到DF的成本为8,从AB到BE的成本为2.

希望有道理......

西蒙

(p.s道歉不好的术语 - “链接”,“边缘” - 无论你喜欢什么;)


为了更好地解释加权类型,想象边缘是火车轨道,节点是站点。边缘的成本是两个站之间列车的行程时间,节点上的成本是交换时间的长度(即使在同一节点,也可能在边缘之间变化,具体取决于平台的距离,服务的规律性等等。

2 个答案:

答案 0 :(得分:3)

是的,将它们视为两条边而不是一条边。然后你可以在没有问题的情况下使用传统的图论算法,特别是如果你总是保证每个方向都有权重。如果您只是使用像我刚刚帮助您创建的“普通”图表,则很容易找到这些算法。

您可以使用Dijkstra's作为最短路径。

您可以Prim's获取最小生成树。

你可以谷歌为非对称TSP尝试找到一个算法,我很确定算法简介也有相关的东西。对不起,我找不到适合你的那个好的实现。关于非对称TSP,这里也有一些很好的问题,现在您知道它被称为非对称TSP。

祝你好运!我喜欢图论。

-Brian J. Stinar -

答案 1 :(得分:2)

对于你的“交换”权重,你可以制作一个小子图来编码它们。例如,您有:

  |   
  |3  
8 D --
  |2
  |

您可以使用边上的权重对其进行编码,如下所示:

  |
  |
  D0
  | \3
  |  \
 8|   D2--
  |  /
  | /2
  D1
  |
  |

请注意,您不必使用8边缘从D0到D1,因为您可以转到D0-> D2-> D1,而重量为5。我不确定你的原始配方是否允许这样做。