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)
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()