通过所有边缘的最短路径的算法

时间:2013-02-26 15:08:31

标签: algorithm graph shortest-path

这是一个朋友最近问我的一个有趣的问题/谜语:

  

你在画网球场的线条。你有一台机器可以绘制直线,但是一旦打开它,你就无法在作业结束前停止它。显然,你需要两次查看一些行。你需要使用的最小量的额外涂料是多少英尺?

法院的规模:

Court

所有线的总和是480英尺。我碰巧知道答案是63英尺(总共543英尺),但我不禁想知道解决这个问题的最佳算法是什么。

这似乎与旅行商问题类似,其中球场上的每条线由图中的顶点表示,并且球场线的交叉点转换为边缘。 (否则,如果行是边和角是顶点,则需要一条遍历所有边的路径,而我不知道任何算法)。也许你需要更加聪明地表达线的交汇点,我对此有一些想法,但还没有真正有效。

我认为问题足够小,可以通过线图用所有路径进行暴力检查。你会怎么编码呢?

2 个答案:

答案 0 :(得分:2)

当且仅当最多两个​​顶点具有奇数度时,并且如果其具有非零度数的所有顶点属于单个连通分量时,无向图具有欧拉轨迹。 (来自http://en.wikipedia.org/wiki/Eulerian_path

当我们得到一个非欧拉图时,我们可以通过向奇度顶点添加边来将其更改为欧拉。 因此,这个问题转向:找到将图形转换为欧拉的最低成本。

算法应该是:

  1. 列出奇数度的所有顶点,建议它是list_vodd [];
  2. 找到list_vodd []中顶点之间的最短边,得到边的两个顶点:pa,pb;
  3. 在pa,pb之间添加一条边(这意味着这条边应该涂两次);
  4. 从list_vodd [];
  5. 删除pa,pb
  6. 转到2,直到list_vodd []。
  7. 中只有两个顶点
  8. 使用任何现有算法在新图中找到带有添加边的Eulerian路由器。

答案 1 :(得分:0)

我在这里玩游戏有点晚了,但是当我试图找到一种算法来确定在州立公园的每条小径上徒步旅行的最短路径时,我遇到了这个问题。这是一张草图,解释了为什么答案是 63 enter image description here 正如理查德提到的,这是一个中国邮递员问题。由于问题没有指定我们必须在同一位置开始和结束,我们可以使用半欧拉图,这就是为什么所有节点都有偶数的原因,除了共享公共边的起点和终点。

这是一个非常好的视频,解释了如何绘制和解决此类问题。 https://www.youtube.com/watch?v=spaUY8PlyYA