【arcpy學習實踐教程】利用krusal最小樹方法生成最小樹

【需求】將兩兩生成的最短路徑生成最小樹

【分析】根據最小樹的原理編寫程序,利用圖來生成最小樹

#! /usr/bin/env python
#coding:utf-8

#以全局變量X定義節點集合,即類似{'A':'A','B':'B','C':'C','D':'D'},如果A、B兩點聯通,則會更改爲{'A':'B','B':'B",...},即任何兩點聯通之後,兩點的值value將相同。

X = dict()      

#各點的初始等級均爲0,如果被做爲連接的的末端,則增加1

R = dict()

#設置X R的初始值

def make_set(point):
    X[point] = point
    R[point] = 0

#節點的聯通分量

def find(point):
    if X[point] != point:
        X[point] = find(X[point])
    return X[point]

#連接兩個分量(節點)

def merge(point1,point2):
    r1 = find(point1)
    r2 = find(point2)
    if r1 != r2:
        if R[r1] > R[r2]:
            X[r2] = r1
        else:
            X[r1] = r2
            if R[r1] == R[r2]: R[r2] += 1

#KRUSKAL算法實現

def kruskal(graph):
    for vertice in graph['vertices']:
        make_set(vertice)

    minu_tree = set()
    
    edges = list(graph['edges'])
    edges.sort()                    #按照邊長從小到達排序
    for edge in edges:
        weight, vertice1, vertice2 = edge
        if find(vertice1) != find(vertice2):
            merge(vertice1, vertice2)
            minu_tree.add(edge)
    return minu_tree


if __name__=="__main__":

    graph = {
        'vertices': ['A', 'B', 'C', 'D', 'E', 'F'],
        'edges': set([
            (1, 'A', 'B'),
            (5, 'A', 'C'),
            (3, 'A', 'D'),
            (4, 'B', 'C'),
            (2, 'B', 'D'),
            (1, 'C', 'D'),
            ])
        }

    result = kruskal(graph)
    print result

網上已經有許多關於最小樹算法,大多都是通過類來定義,通過圖這一數據結構來解決,因爲之前對圖的數據結構不太瞭解,所以現在還在苦啃數據結構一書,希望能有所突破

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章