def main(): algorithm: str = "" if len(argv) < 2: print('Not enough arguments!') print('Usage: main (-k|-p)') return elif argv[1] == '-k': algorithm = KRUSKAL elif argv[1] == "-p": algorithm = PRIM else: print('Unknown algorithm') return n: int = 0 try: n = int(stdin.readline()) except ValueError: print("Wrong \'n\' input format") return G: Graph = Graph(n, directed=False) m: int = 0 try: m = int(stdin.readline()) except ValueError: print("Wrong \'m\' input format") return try: for _ in range(m): line = stdin.readline() u, v, w = getEdge(line) edge = Edge(u, v, w) G.add_edge(edge) except ValueError: print("Wrong \'u v w\' input format") return mst: List[Edge] = None weight: float = 0 if algorithm == KRUSKAL: mst, weight = MST.kruskal(G) elif algorithm == PRIM: mst, weight = MST.prim(G, 1) else: raise Exception('Unsupported algorithm') for e in mst: fst, snd, w = e.unpack() u, v = (fst, snd) if fst < snd else (snd, fst) print(u, v, w) print(weight)
def run(G: Graph) -> Result: c: Counter = Counter() mst, _ = MST.prim(G, 1) # mst, _ = MST.kruskal(G) Tree = Graph(G.N, directed=False) Tree.add_edges(mst) visited: List[bool] = [False for _ in range(G.N + 1)] walk: List[int] = [] def DFS(u: int): visited[u] = True walk.append(u) c.inc() for e in Tree.get_incident_edges(u): v = e.snd if not visited[v]: DFS(v) DFS(1) path: List[Edge] = [] W: float = 0.0 first: int = walk[0] u: int = first walk.append(first) for v in walk[1:]: c.inc() e = G.get_edge(u,v) path.append(e) W += e.w u = v memory: int = 0 memory += sizeof(mst) memory += sizeof(Tree) memory += sizeof(visited) memory += sizeof(walk) return Result(c.get(), W, memory, path=path)