6497 - 전력난
info
- 문제 보기: 6497 - 전력난
- 소요 시간: 23분 34초
- 풀이 언어:
python
- 체감 난이도: 2️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
그래프
최소스패닝트리
유니온파인드
풀이 코드
info
- 메모리: 61004 KB
- 시간: 1852 ms
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
parent = []
def union(a, b):
global parent
pa = find(a)
pb = find(b)
if pa < pb:
parent[pb] = pa
else:
parent[pa] = pb
def find(x):
global parent
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
def solution():
global parent
while True:
m, n = map(int, input().split())
if m == n == 0: break
parent = [i for i in range(m)]
tree = []
zsum = 0
for _ in range(n):
x, y, z = map(int, input().split())
zsum += z
tree.append((z, x, y))
# Kruskal
mst_value = 0
tree.sort()
for data in tree:
weight, a, b = data
if find(a) != find(b):
mst_value += weight
union(a, b)
print(zsum - mst_value)
if __name__ == '__main__':
solution()
풀이 해설
MST 문제이므로, 크루스칼 알고리즘을 사용하면 된다.
최소 스패닝 트리 풀이 내용으로 대체한다.
다만 절약 비용을 구하는 문제이므로, mst_value
로 MST 간선 총합을 구한 뒤,
모든 z
값의 합에서 이를 빼야 한다.
메모
- 금방 풀었는데 입력받는 방식이 달라서 WA 고치느라 시간 더 먹음
- TC 여러개 주어지고 TC 개수 대신 EOF 플래그가
0 0
으로 주어진다는 소리였음 🙁
- TC 여러개 주어지고 TC 개수 대신 EOF 플래그가
while True:
m, n = map(int, input().split())
if m == n == 0: break
--> 따라서 위와 같이 수정해야 AC를 받을 수 있다.