Esempio n. 1
0
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)
Esempio n. 2
0
    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)