所以我需要解决这个图,我对如何解决它有一个大致的想法,但如果我做错了,请纠正我。
所以要找到MST,我需要在图上执行Kruskals算法
这是我对这个Kruskals算法的伪代码
秩(V,E) A = null; 每个v包含在V中 使不相交的集合(v) 按重量排序E越来越多 对于每个(v1,v2)包含在E中 如果
Kruskal(V,E)A = null; for each v contains in V make disjoint set(v) Sort E by weight increasingly for each(v1, v2) contains in E if Find(v1) is not equal to Find(v2) A = A Union {(v1,v2)} Union(v1,v2) Return A
我首先要做的是找到距离最短的节点吗?
1)
我假设S到H的距离最短,因为d(h,s)= -3
所以A = {(h,s)}
现在我们遵循这种模式
2)A = {(h,s),(s,f)}
3)A = {(h,s),(s,f)(s,n)}
4)A = {(h,s)(s,f)(s,n)(f,k)}
5)A = {(h,s)(s,f)(s,n)(f,k)(s,m)}(我们跳过H到N,因为路径已经从h到n这是通过s)
6)A = {(h,s)(s,f)(s,n)(f,k)(s,m)(d,b)}
7)A = {(h,s)(s,f)(s,n)(f,k)(s,m)(d,b)(b,m)}
所以现在因为有一条连接到所有边缘的路径我们是对的吗?
但我不明白的是,距离[u,v]比通过多个顶点的路径[u,v]短。例如,d [d,m]比p [d,m]短,首先通过B.我做错了吗?
答案 0 :(得分:1)
你没有做错任何事。无法保证MST保留节点之间的最短距离。例如:三个节点完整图ABC,边缘权重为3,2,2(对我的ascii艺术道歉):
A --- 2 --- B
| |
2 /
| /
C----3---/
最小生成树是C-A-B,但原始图中B和C之间的距离是3,而在MST 4中。