아이공의 AI 공부 도전기

[Baekjoon] 1197번 : 최소 스패닝 트리 (Python, 최소 신장 트리)

 

     

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

코드 링크

https://github.com/stellaluminary/Baekjoon

 

GitHub - stellaluminary/Baekjoon

Contribute to stellaluminary/Baekjoon development by creating an account on GitHub.

github.com

Python

 

방법 1 - 메모리 46980KB / 시간 344ms / 코드 길이 528B

 

본 문제는 대놓고 최소 신장 트리를 구하도록 유도한 문제이다.

이에 따라 본 문제를 크루스칼 알고리즘에 의거한 문제를 풀어내면 된다.

각 노드마다의 parent root를 저장하는 p list

가중치가 최소가 되는 MST를 위해 cost 비용을 정렬하여 기입하는 edges list

 

정렬된 edges를 기반으로 cycle이 없는지 확인하고 만약 cycle이 아니라면 parent node를 작은 값에 맞추는 작업을 진행한다.

 

 

import sys
input = sys.stdin.readline

def f_p(p, x):
    if p[x] != x:
        p[x] = f_p(p, p[x])
    return p[x]

def union(p, a, b):
    a = f_p(p, a)
    b = f_p(p, b)
    if a < b:
        p[b] = a
    else:
        p[a] = b

v, e = map(int, input().split())
edges=[]
for i in range(e):
    a, b, c = map(int, input().split())
    edges.append((c,a,b))
edges.sort()

p = [i for i in range(v+1)]
res = 0
for edge in edges:
    c, a, b = edge
    if f_p(p, a) != f_p(p, b):
        union(p, a, b)
        res += c
print(res)

 

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading