Skip to content

Instantly share code, notes, and snippets.

@siddMahen
Created January 4, 2014 22:03
Show Gist options
  • Save siddMahen/8261350 to your computer and use it in GitHub Desktop.
Save siddMahen/8261350 to your computer and use it in GitHub Desktop.

Revisions

  1. siddMahen created this gist Jan 4, 2014.
    42 changes: 42 additions & 0 deletions prim.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,42 @@
    from sys import argv
    import re

    # open the file and get read to read data
    file = open(argv[1], "r");
    p = re.compile("\d+");

    # initialize the graph
    vertices, edges = map(int, p.findall(file.readline()))
    graph = [[0]*vertices for _ in range(vertices)]

    # populate the graph
    for i in range(edges):
    u, v, weight = map(int, p.findall(file.readline()))
    graph[u][v] = weight
    graph[v][u] = weight

    # initialize the MST and the set X
    T = set();
    X = set();

    # select an arbitrary vertex to begin with
    X.add(0);

    while len(X) != vertices:
    crossing = set();
    # for each element x in X, add the edge (x, k) to crossing if
    # k is not in X
    for x in X:
    for k in range(vertices):
    if k not in X and graph[x][k] != 0:
    crossing.add((x, k))
    # find the edge with the smallest weight in crossing
    edge = sorted(crossing, key=lambda e:graph[e[0]][e[1]])[0];
    # add this edge to T
    T.add(edge)
    # add the new vertex to X
    X.add(edge[1])

    # print the edges of the MST
    for edge in T:
    print edge