https://www.acmicpc.net/problem/14621
14621번: 나만 안되는 연애
입력의 첫째 줄에 학교의 수 N와 학교를 연결하는 도로의 개수 M이 주어진다. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000) 둘째 줄에 각 학교가 남초 대학교라면 M, 여초 대학교라면 W이 주어진다. 다음 M개의
www.acmicpc.net
대학에서 다른 대학으로 모두 이동이 가능해야하고 모든 간선의 합이 최소가 되어야하므로 최소 스패닝 트리를 찾아야함을 알 수 있습니다. 조건에 의해 남초 - 남초, 여초 - 여초를 연결하는 간선은 힙에 넣지 않고 크루스칼을 돌리면 됩니다. 그리고 마지막에 모든 정점들이 같은 집합에 속해있는지만 체크해주면 됩니다.
import sys, heapq
sys.stdin = open("input.txt", "r")
input = sys.stdin.readline
n, m = tuple(map(int, input().split()))
status = ['X'] + list(input().split())
parent = [
x for x in range(n + 1)
]
q = []
for _ in range(m):
v1, v2, w = tuple(map(int, input().split()))
# 같은 대학끼리는 넘어간다.
if status[v1] == status[v2]:
continue
heapq.heappush(q, (w, v1, v2))
def find(p):
if parent[p] == p:
return p
parent[p] = find(parent[p])
return parent[p]
ans = 0
# 크루스칼
while q:
w, v1, v2 = heapq.heappop(q)
pa = find(v1)
pb = find(v2)
if pa == pb:
continue
ans += w
if pa < pb:
parent[pb] = pa
else:
parent[pa] = pb
cur = find(parent[1])
for p in parent[2:]:
# 모든 대학이 같은 집합에 있지 않으면 -1을 출력
if cur != find(p):
print(-1)
sys.exit(0)
print(ans)
'문제 해결 > BOJ' 카테고리의 다른 글
[백준] 학교 탐방하기 (0) | 2023.03.21 |
---|---|
[백준] 동방 프로젝트(large) (0) | 2023.03.20 |
[백준] 영우는 사기꾼? (0) | 2023.03.18 |
[백준] 개미굴 (0) | 2023.03.17 |
[백준] 스크루지 민호 2 (0) | 2023.03.16 |