minimum spanning tree

原创 2018年04月15日 11:53:42

首先我们要给出下面一个概念,如何可以节约空间地保存无向图:


    a = [100 for i in range(int(10*11/2))]
    def update(i,j,l):
        if i > j:
            a[int(i*(i+1)/2+j)] = l
        else:
            a[int(j*(j+1)/2+i)] = l
    def length(i,j):
        if i > j:
            return a[int(i*(i+1)/2+j)]
        else:
            return a[int(j*(j+1)/2+i)]
    update(1,0,2)
    update(2,0,8)
    update(3,1,4)
    update(4,2,7)
    update(5,3,12)
    update(5,4,11)
    update(6,0,1)
    update(6,1,3)
    update(6,2,9)
    update(6,3,5)
    update(6,4,6)
    update(6,5,10)


基于python的简单实现:

def prime(start):
    list_a = [0,1,2,3,4,5,6]
    list_s = [start]
    dist = 0
    
    while True:
        if len(list_s) == 7:
            return dist
        temp = {}
        for i in list_s:
            for j in list(set(list_a)-set(list_s)):
                if length(i,j) < 100:
                    temp[length(i,j)] = [i,j]
        dist += min(temp)
        list_s.append(temp[min(temp)][1])
                

以上prime算法基于点,所以比较适合稠密图。

接下来介绍一个更适合稀疏图的算法,基于边:


Python的代码实现如下:

def kruskal():
    list_s = []
    path = []
    dist = 0
    E = {}
    for i in range(0,7):
        for j in range(0,i):
            E[(i,j)] = length(i,j)
    while (len(list_s) < 7 ):
        i1 = min(E.items(), key=lambda E: E[1])[0][0]
        j1 = min(E.items(), key=lambda E: E[1])[0][1]
        min_path = min(E.items(), key=lambda E: E[1])[0]
        min_dist = min(E.items(), key=lambda E: E[1])[1]
        E.pop(min_path)
        if i1 in list_s and j1 in list_s:
            pass
        else:
            path.append(min_path)
            dist += min_dist
            if i1 in list_s:
                list_s.append(j1)
            else:
                list_s.append(i1)
                if j1 in list_s:
                    pass
                else:
                    list_s.append(j1)
    return [dist,path]
            

if __name__ == '__main__':
    a = [100 for i in range(int(7*8/2))]
    def update(i,j,l):
        if i > j:
            a[int(i*(i+1)/2+j)] = l
        else:
            a[int(j*(j+1)/2+i)] = l
    def length(i,j):
        if i > j:
            return a[int(i*(i+1)/2+j)]
        else:
            return a[int(j*(j+1)/2+i)]
    
    update(1,0,2)
    update(2,0,8)
    update(3,1,4)
    update(4,2,7)
    update(5,3,12)
    update(5,4,11)
    update(6,0,1)
    update(6,1,3)
    update(6,2,9)
    update(6,3,5)
    update(6,4,6)
    update(6,5,10)

最小生成树(Minimum Spanning Tree)(Prim算法)

1. 什么是最小生成树(Minimum Spanning Tree) 2. 贪心算法: 1) 什么是“贪”:每一步都要最好的 2) 什么是“好”:权重最小的边 3) 需要约束:      a) 只...
  • u013354805
  • u013354805
  • 2016-04-05 11:21:30
  • 569

最小生成树(minimum spanning tree)

A minimum spanning tree (MST) or minimum weight spanning tree is then a spanning tree with weight le...
  • csmqq
  • csmqq
  • 2010-08-05 20:50:00
  • 4165

说说最小生成树(Minimum Spanning Tree)

minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点、无环、路径的权重和为所有路径中最小的. graph-cut 对图的一个...
  • gsky1986
  • gsky1986
  • 2015-04-20 14:24:15
  • 2674

The minimum spanning tree of a graph(图的最小生成树)

Q: minimum spanning tree 的定义 A: 给定一幅图G = (V,E), 找到E的一个能够连接起G中所有的节点(vertices)的边子集T, 并且边子集的权重之和最小, 这就是...
  • a130737
  • a130737
  • 2014-08-08 13:32:04
  • 843

让我们来谈谈最小生成树(Minimum Spanning Tree)算法

现实生活中我们往往会遇到类似于旅游路线规划,使用怎么样的一条旅游路线能够让我们花费最少的旅费获得一样的感受。这时如果你学过算法的话,恭喜你可以在女票面前大显生手了。这其实是一个最小生成树问题,可以利用...
  • shaya118
  • shaya118
  • 2014-12-24 21:34:25
  • 2372

Geeks : Kruskal’s Minimum Spanning Tree Algorithm 最小生成树

寻找图中最小连通的路径,图如下: 算法步骤: 1. Sort all the edges in non-decreasing order of their weight. 2. Pick th...
  • kenden23
  • kenden23
  • 2014-05-24 12:10:16
  • 1716

MST(Kruskal’s Minimum Spanning Tree Algorithm)

You may refer to the main idea of MST in graph theory. http://en.wikipedia.org/wiki/Minimum_spanning...
  • zhengnanlee
  • zhengnanlee
  • 2013-07-09 09:15:45
  • 2040

E - Minimum spanning tree for each edge

最小生成树+lca
  • ifeli
  • ifeli
  • 2017-07-17 15:49:39
  • 73

Prim's Minimal Spanning Tree_Prim(最小生成树的Prim算法)

题目: 最小生成树是什么? 在图的一堆点(假设有V个)中,有些两点之间有边,有些两点之间没有边。对于两点之间的边,权重有大有小,目标是找到一些边,使得图是联通的并且这些边的和最小。 算法: 贪心。 ...
  • feliciafay
  • feliciafay
  • 2014-02-13 08:56:58
  • 1697

Prim's minimum spanning tree algorithm

#include #include #include #include #include using namespace std; typedef struct { int head;...
  • lsxpu
  • lsxpu
  • 2015-03-23 20:25:04
  • 481
收藏助手
不良信息举报
您举报文章:minimum spanning tree
举报原因:
原因补充:

(最多只允许输入30个字)