STUDY/Algorithm

[백준] 1197 최소 스패닝 트리 python

sinawi95 2022. 2. 22. 22:01
728x90

https://www.acmicpc.net/problem/1197

 

1197번: 최소 스패닝 트리

첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이

www.acmicpc.net

백트래킹 문제를 풀다가 계속 틀려서 쉬운문제를 하나 가져왔다.

최소 신장 트리를 구하는 문제이고 prim 알고리즘을 사용해서 풀었다.

다익스트라랑 크게 차이가 없는듯 하다.

from heapq import heappop, heappush
def mst(g):
    ret = 0
    visit = [0 for _ in range(len(g))]
    h = [(0, 1)] # cost, start
    while h:
        cur_cost, cur = heappop(h)
        if visit[cur]: continue
        visit[cur] = 1
        ret += cur_cost
        for adj_c, adj in g[cur]:
            heappush(h, (adj_c, adj))
    return ret

def main():
    v, e = map(int, input().split())
    g = [[] for _ in range(v + 1)]
    for _ in range(e):
        a, b, c = map(int, input().split())
        g[a].append((c, b))
        g[b].append((c, a))

    print(mst(g))


if __name__ == "__main__":
    main()

 

백트래킹 문제를 많이 풀어야하느데....