📊알고리즘, 문제풀이/📈문제풀이 (PS)

[알고리즘][Python] 백준 1647 도시 분할 계획 문제 풀이

Written by Donghak Park

문제 출처 : www.acmicpc.net/problem/1647

 

1647번: 도시 분할 계획

첫째 줄에 집의 개수N, 길의 개수M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 집

www.acmicpc.net


문제 해석 : 마을을 두개로 분할 하려고 한다. 이때 마을 내부에 있는 길의 Cost가 최소가 되도록 마을을 분할 해야한다.

 

문제 풀이 : 최소 신장트리를 이용해서 마을 전체를 순회하는 도로를 구성한 다음 가장 큰 비용을 가진 길 하나를 제거하면 각자 모든 원소를 포함하는 2개의 마을 도로가 생성된다.


풀이 코드

import sys
input = sys.stdin.readline

def find_parent(parent, x):
    if parent[x] != x:
        parent[x] = find_parent(parent, parent[x])
    return parent[x]

def make_union(parent, a, b):
    a = parent[a]
    b = parent[b]
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

N, M = map(int, input().split())
answer = 0

Q = []
parent = [0] * (N + 1)
for i in range(1, N+1):
    parent[i] = i

for _ in range(M):
    a, b, c = map(int, input().split())
    Q.append([c,a,b])

Q.sort()
last = 0

for element in Q:
    cost, start, end = element
    if find_parent(parent, start) != find_parent(parent, end):
        make_union(parent, start, end)
        answer += cost
        last = cost

print(answer - last)

author : donghak park
contact : donghark03@naver.com

## 문제의 저작권은 백준 알고리즘 사이트에 있습니다. 혹시 문제가 되는 부분이 있으면 연락 바랍니다.