【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

网上已经有许多关于最小树算法,大多都是通过类来定义,通过图这一数据结构来解决,因为之前对图的数据结构不太了解,所以现在还在苦啃数据结构一书,希望能有所突破

转载自:https://blog.csdn.net/ldl250058/article/details/82149322

You may also like...