我正在寻找关于哪里可以开始寻找这个问题的解决方案的指示。
谷歌搜索了一段时间后,我发现的唯一问题是我的问题是minimum spanning tree。不同之处在于我不是在寻找跨越图中所有顶点的树,而是跨越3个给定顶点的树。
我不是在寻找一个完整的程序,而是在答案的大致方向上指示。
我的另一个想法是使用Dijkstra's algorithm运行3次搜索。我们的想法是通过组合不同的最短路径以某种方式找到最佳路径。我不知道如何做到这一点。
以下是我所说的图表类型的图形示例:
因此,任务是找到一种方法来找到连接任何3个椎体的最小总重量。
编辑:
我通过Dijkstra的algorithem运行3次搜索解决了这个问题。然后我通过添加所有uniqe边缘找到了连接3个顶点的最小总和权重的顶点。感谢所有的帮助:)
答案 0 :(得分:0)
我很确定你可以用Dijkstra算法做到这一点,唯一的技巧是你不知道访问节点的顺序是什么,所以你必须尝试所有6个排序。
因此,如果您有节点A,B和C,对于第一个排序A,B,C,您将在A和B之间,B和C之间以及C和A之间运行Dijkstra。然后你'做下一个订单A,C,B。继续从那里开始。
答案 1 :(得分:0)
我认为您使用Dijkstra的想法很好。
你可以通过尝试每个顶点x作为起点来计算和的最小值w(x,a)+ w(x,b)+ w(x,c)其中a,b,c是你想要连接的3个顶点,w(u,v)是用Dijkstra计算的最短路径。
我相信这个最小的和将是连接3个顶点的最小总和。
不幸的是,这意味着运行Djikstra 3.n次。
更好的方法是从每个要连接的节点运行Djikstra,并将距离存储到图中的每个节点。 (所以wa(x)是从x到a等的最短距离。)
然后您可以像以前一样迭代每个顶点x并计算和的最小值wa(x)+ wb(x)+ wc(x)
这相当于算法1,但由于Dijkstra仅运行3次,因此速度提高了n倍。
答案 2 :(得分:0)
由于权重都是正数且图表是无向的限制,您可以使用Dijkstra算法解决问题,如建议的那样,让我们说有问题的节点是A
,B
,C
,全部在图G
中。
G
开始运行Dijkstra:
A -> B
B -> C
C -> A
这些形成连接三个顶点的三角形的边缘。
我们可以这样做,因为图表是无向的,这意味着A -> B
的最短路径与B -> A
的最短路径相同。
A
,B
和C
的最短路径将恰好包含两条边。 (假设你很高兴忽略了“三角形”中三条0重量路径引起的循环的可能替代解决方案)。因此,该算法将以与Dijkstra算法相同的时间复杂度进行。
答案 3 :(得分:0)