1647 - 도시 분할 계획
info
- 문제 보기: 1647 - 도시 분할 계획
- 소요 시간: 12분 14초
- 풀이 언어:
python
- 체감 난이도: 2️⃣~3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
그래프
최소스패닝트리
유니온파인드
풀이 코드
info
- 메모리: 199932 KB
- 시간: 3032 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
n, m = map(int, input().split())
parent = [x for x in range(n+1)]
graph = []
for _ in range(m):
a, b, weight = map(int, input().split())
graph.append((weight, a, b))
path = []
graph.sort()
for data in graph:
weight, a, b = data
if find(a) != find(b):
union(a, b)
path.append(weight)
print(sum(path) - max(path))
if __name__ == '__main__':
solution()
풀이 해설
path = []
graph.sort()
for data in graph:
weight, a, b = data
if find(a) != find(b):
union(a, b)
path.append(weight)
다음과 같이 크루스칼 알고리즘으로 MST를 생성하고,
print(sum(path) - max(path))
분리된 두 마을 사이에 있는 길들은 필요가 없으므로 없앨 수 있다.
분리된 두 마을 간에는 간선이 필요 없으므로, MST의 간선 중 가장 가중치가 큰 값을 하나 빼면 답이 된다.
마을에는 집이 하나 이상 있어야 한다.
다만 최소 하나의 집이 있어야 마을로 정의되는데,
어떤 간선을 쳐내든 분할된 마을의 형태는 모두 최소 하나의 집을 가지게 되므로, 딱히 까다로운 조건은 아니다.
메모
setrecursionlimit
까먹었는데 AC받은게 ㄹㅈㄷ