【问题标题】:How to visit vertices in undirected graph如何访问无向图中的顶点
【发布时间】:2014-03-06 08:24:14
【问题描述】:

从任意位置访问无向图的所有顶点的正确算法是什么?例如,给定以下 7 个顶点的图,从 #6 开始:

有许多可能的序列: 67645321, 676421235, 6453212467, ...

如何迭代最短路径的顶点(第一个)? 谢谢。

【问题讨论】:

  • 这必须是 NP 完成的。
  • 那么如果这是NPC,那么对于最短路径,它必须迭代所有解决方案以找到最短路径?嗯。那么有什么方法可以找到最佳(可能不是最好的)解决方案吗?
  • 你不是要求所有对的最短路径,对吧?我不知道这是否是“最短的”,但我将使用拓扑排序将图形分解为树;最后遍历树的所有节点。
  • 我认为toposort只适用于DAG?如果我错了,请纠正我。
  • 对不起,我不擅长记住算法的名称。将起始节点标记为距离=0,所有以距离=0+1=1连接的节点;所有连接到距离 = 1 => 距离 = 1+1=2 的节点的节点,等等。如果要标记距离的节点已经有距离值(等于或更小),请断开此边。现在你应该有一个最小深度(或高度)的树,起始节点作为根节点。

标签: algorithm graph iteration shortest-path


【解决方案1】:

跟进我上面的评论,

1-2-3
  | |
  4-5
  |
  6-7

按节点值排序,小值先行,结果:

6-+-4-+-2-+-1
  `-7 `-5 `-3

遍历树:

6-4-2-1-2-3-2-4-5-4-6-7

可以进行更多优化,例如对于每个节点,保持每个“孩子”的“深度”或权重,首先横切浅孩子/轻孩子。

6-+-(5)-4-+-(3)-2-+-(1)-1
  `-(1)-7 `-(1)-5 `-(1)-3

因此我们横向如下:

6-7-6-4-5-4-2-1-2-3

可能还有更多优化方法,祝你好运!

【讨论】:

  • 这不会产生67645321的期望输出。
  • 是的,我只是一边打字一边思考。这个 67645321 让我突然想到动态编程是否会比图形算法做得更好。嗯.....
【解决方案2】:
  1. 找到距起始节点最远的节点,即距起始节点的最短路径具有最大长度的节点。调用此节点Q

  2. 计算从Q 到图表中所有其他节点的距离。将此距离称为D1, D2, ...

  3. 从起始节点开始行走。

  4. 始终走到最近的未访问节点。

  5. 如果相同距离内有多个未访问节点,即如果有多个未访问节点直接连接到当前节点,则走到Di最大的那个。总是离开Q离开

根据您的示例图,您可以找到 Q=1D1=0D2=1D3=2D4=2D5=3D6=3D7=4。从 6 开始,您有 4 和 7 作为选项,您选择 7 因为D7>D4。从那里转到 4,因为那是最近的未访问节点。然后到 5,因为D5>D2。最后是 3、2、1。

这个算法并不完美,需要一些微调。例如,在步骤 1 中选择 Q 时,您最终可能会得到节点 3,因为它与 6 的距离相同,因此您需要一些额外的启发式方法来解决关系,可能有利于路径最少的节点。所以你不会得到完美的结果,但我会说你会得到一些合理的结果。

【讨论】:

  • 我喜欢这个。我很好奇这个算法是否提供了更好的解决方案来从一个固定的起点在二维网格中找到最长的路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多