Esempio n. 1
0
def roadsAndLibraries(n, c_lib, c_road, cities):
    # Complete this function
    if not n:
        return 0
    if c_lib <= c_road:
        return n * c_lib
    graph = Graph()
#    for _n in range(n):
#        graph.addVertex(Vertex(str(_n+1)))
    for edge in cities:
        try:
            graph.addVertex(Vertex(str(edge[0])))
        except KeyError:
            pass
        try:
            graph.addVertex(Vertex(str(edge[1])))
        except KeyError:
            pass
        graph.createEdge(str(edge[0]), str(edge[1]))
    print graph.degree
    subgraphs = graph.listSubGraphs()
    print subgraphs
    libraries = len(subgraphs) + (n - graph.degree)
    roads = 0
    for g in subgraphs:
        roads += len(g) - 1
    return (libraries * c_lib) + (roads * c_road)
Esempio n. 2
0
def prims(graph, start):
    print("Finding minimum spanning tree")
    graph.print()

    minSpanTree = Graph()
    heap = EdgeMinHeap()
    visited = dict()
    for vertex in graph.getVertices():
        visited[vertex] = False

    minSpanTree.addVertex(start)
    visited[start] = True

    print("Adding edges adjacent to initial vertex to potential edges")
    for edge in graph.getAdjEdges(start):
        heap.siftUp(edge[0], edge[1], edge[2])
    heap.print()

    done = heap.isEmpty()
    while not done:
        print("Sifting down to find shortest edge with an unvisited destination")
        heap.print()
        top = heap.siftDown()
        found = not visited[top[1]] # top.to
        done = heap.isEmpty()
        heap.print()
        while not found and not done:
            top = heap.siftDown()
            found = not visited[top[1]]
            heap.print()
            if heap.isEmpty():
                done = True

        if not found:
            break
        print(str(top) + " is a valid edge. Adding to MST")
        visited[top[1]] = True
        minSpanTree.addVertex(top[1])
        minSpanTree.addEdge(top[0], top[1], top[2])
        print("Adding edges adjacent to " + str(top[1]) + " to potential edges")
        for edge in graph.getAdjEdges(top[1]):
            if not visited[edge[1]]:
                heap.siftUp(edge[0], edge[1], edge[2])
        heap.print()

    return minSpanTree
from graphs import Graph, Vertex, Edge

graph = Graph()

for n in '123456':
    graph.addVertex(Vertex(n))

graph.createEdge('1', '2')
graph.createEdge('1', '3')
graph.createEdge('2', '3')
graph.createEdge('2', '4')
graph.createEdge('3', '4')
graph.createEdge('5', '6')

print graph.listSubGraphs()