在包含2个指定顶点的无向图中寻找最短周期

时间:2019-05-14 22:29:41

标签: java algorithm graph hashmap shortest-path

我得到了一个类似于无向图的哲学家数据集。哲学家存储在哈希图中,其中的键是哲学家的名称,值是他的邻居的列表。

用户输入2位哲学家作为输入,我需要找到最短的周期(如果存在的话),其中包括这2位哲学家。

起初,我认为这个问题与旅行商问题非常相似,但是在这个问题中我们也有旅行距离,每个顶点只能被访问一次,在这里似乎不是这种情况。这个问题的解决方案似乎与图形有关,但是我不确定使用哪种算法,甚至哪个问题都与之相似。

我考虑过的一种解决方案是在给定图中查找所有周期,将结果减少到仅包含用户给出的哲学家的周期,并从中选择最短的周期,因为我会根据如何对周期进行评分他们做出的许多“跳跃”实际上是一个简单的计数器。问题在于,考虑到数据集有多大以及可能形成(很多)循环数,我担心这可能不是最佳解决方案。

输出必须采用以下格式:{u1,u2,u3,u4,u5,u1}其中u是创建我要寻找的循环的每个哲学家的名字。如果不存在这种循环,那么我只需要打印一条适当的消息即可。

1 个答案:

答案 0 :(得分:1)

您可以使用Suurballe算法的变体。如Wikipedia所述(在https://en.wikipedia.org/wiki/Suurballe's_algorithm):

  

Suurballe算法是一种算法,用于在非负加权有向图中找到两条不相交的路径,以使两条路径连接同一对顶点并具有最小的总长度。 […] Suurballe算法的主要思想是使用Dijkstra算法找到一条路径,修改图形边缘的权重,然后第二次运行Dijkstra算法。该算法的输出是通过组合这两条路径,丢弃两条路径在相反方向上遍历的边并使用其余边形成两条路径作为输出返回而形成的。

及更高版本:

  

如上所述,Suurballe算法的版本查找具有不相交边但可以共享顶点的路径。可以使用相同的算法来找到顶点不相交的路径,方法是将每个顶点替换为一对相邻的顶点,其中一个顶点与原始顶点的所有输入邻接 u-in 相同,与所有传出邻接 u-out 。此修改图形中的两条边不相交路径必定与原始图中的两条顶点不相交路径相对应,反之亦然,因此将Suurballe算法应用于修改后的图会导致在原始图中构造两条顶点不相交的路径。 / p>

因此,您需要转换| V |的未加权,无向图。顶点和| E |未加权,未定向的边到2 | V |的加权有向图顶点和2 | E | + \ | V |加权的定向边缘;然后应用Suurballe算法;然后将结果转换回原始图上的一个循环。