[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/yangjun616/algorithm-python2/master/kruskal_algorithm.py [Back]  [Original]

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

"""
Kruskal

ABCD((1,'A','B'),(5,'A','C'),(3,'A','D'),(4,'B','C'),(2,'B','D'),(1,'C','D')


"""

#X{'A':'A','B':'B','C':'C','D':'D'},AB{'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

"""
:
1.https://github.com/qiwsir/Algorithms-Book--Python/blob/master/5-Greedy-algorithms/kruskal.py
2.(GILLES Brassard,Paul Bratley)
"""

Web Proxy Viewer  |  New URL  |  Original Page