[英]Finding shortest cycle in undirected graph that includes 2 specified vertices
我得到了一个类似于无向图的哲学家数据集。 哲学家存储在哈希图中,其中的键是哲学家的名称,值是他的邻居的列表。
用户输入2个哲学家名称作为输入,我需要找到最短的周期(如果存在的话),其中包括这2个哲学家。
起初我以为这个问题与旅行商问题非常相似,但是在这个问题中我们也有旅行距离,每个顶点只能被访问一次,在这里似乎不是这种情况。 这个问题的解决方案似乎与图形有关,但是我不确定使用哪种算法,甚至哪个问题都与之相似。
我考虑过的解决方案涉及找到给定图中的所有周期,将结果减少到仅包含用户给出的哲学家的周期,并仅从那些周期中选出最短的周期,因为我会根据多少“跳跃”来对周期进行评分他们做出的决定本质上将是一个简单的计数器。 这样做的问题是,考虑到数据集有多大以及可能形成(很多)循环数,我担心这可能不是最佳解决方案。
输出必须采用以下格式:{u1,u2,u3,u4,u5,u1}其中u是创建我要寻找的循环的每个哲学家的名字。 如果不存在这样的周期,那么我只需要打印一条适当的消息。
您可以使用Suurballe算法的变体。 如Wikipedia所述(在https://en.wikipedia.org/wiki/Suurballe's_algorithm上 ):
Suurballe算法是一种算法,用于在非负加权有向图中找到两条不相交的路径,以使两条路径连接同一对顶点并具有最小的总长度。 […] Suurballe算法的主要思想是使用Dijkstra算法找到一条路径,修改图形边缘的权重,然后第二次运行Dijkstra算法。 该算法的输出是通过组合这两个路径,丢弃路径沿相反方向遍历的边并使用其余边形成两条路径作为输出返回而形成的。
然后:
如上所述的Suurballe算法的版本可以找到边缘不相交但可以共享顶点的路径。 可以使用相同的算法来查找顶点不相交的路径,方法是用一对相邻的顶点替换每个顶点,其中一个顶点具有原始顶点的所有传入邻接u-in ,而另一个顶点具有所有出局邻接u出 。 此修改图形中的两个边不相交路径必定与原始图中的两个顶点不相交路径相对应,反之亦然,因此将Suurballe算法应用于修改后的图会导致在原始图中构造两个顶点不相交的路径。
因此,您需要翻译|的无权,无向图。 V | 顶点和| E | 加权有向图2 |的未加权,无向边。 V | 顶点和2 | E | + | V | 加权的定向边缘; 然后应用Suurballe算法; 然后将结果转换回原始图上的循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.