728x90
문제 링크: https://www.acmicpc.net/problem/14621
14621번: 나만 안되는 연애
입력의 첫째 줄에 학교의 수 N와 학교를 연결하는 도로의 개수 M이 주어진다. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000) 둘째 줄에 각 학교가 남초 대학교라면 M, 여초 대학교라면 W이 주어진다. 다음 M개의
www.acmicpc.net
문제 풀이
최소 스패닝 트리를 이용하는 문제이다. 하지만 조건이 하나 추가 되었는데, 연결되어 있지 않은 간선을 유니온 시킬 때 둘다 남초 대학교 혹은 여초 대학교라면 유니온 시키지 않는다. 남자 - 여자 - 여자 - 남자 이렇게 연결 될 수도 있다 생각할 수 있는데 1번 조건에 따르면 불가능하다. 그 외에는 기본 최소 스패닝 트리이고 간선이 n-1개가 안된다면 -1을 출력해준다.
코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
sys.setrecursionlimit(10**9) | |
input = sys.stdin.readline | |
def find(p, x): | |
if p[x] != x: | |
p[x] = find(p, p[x]) | |
return p[x] | |
def union(p, a, b): | |
a = find(p, a) | |
b = find(p, b) | |
if a < b: | |
p[b] = a | |
else: | |
p[a] = b | |
n, m = map(int, input().split()) | |
schools = ['X'] + input().split() | |
p = [i for i in range(n+1)] | |
edges = [] | |
for _ in range(m): | |
u, v, d = map(int, input().split()) | |
edges.append((d, u, v)) | |
edges.sort() | |
result, lines = 0, 0 | |
for edge in edges: | |
cost, a, b = edge | |
if schools[a] != schools[b]: | |
if find(p, a) != find(p, b): | |
result += cost | |
lines += 1 | |
union(p, a, b) | |
if lines == n-1: | |
break | |
print(result if lines == n-1 else -1) |
728x90
'BOJ' 카테고리의 다른 글
[BOJ][Python] 백준 2254번 - 감옥 건설 (0) | 2021.09.22 |
---|---|
[BOJ][Python] 백준 18870번 - 좌표 압축 (0) | 2021.09.22 |
[BOJ][Python] 백준 2903번 - 중앙 이동 알고리즘 (0) | 2021.09.21 |
[BOJ][Python] 백준 10822번 - 더하기 (0) | 2021.09.21 |
[BOJ][Python] 백준 14889번 - 스타트와 링크 (0) | 2021.09.21 |