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. 핵심
- 알고리즘 유형: 최소 스패닝 트리
- 크루스칼 알고리즘
- 성별이 다른, 남자대학교와 여자대학교만 연결되어야 한다.
- 남-남, 여-여끼리 간선이 연결되면 안된다.
2. 코드(Python)
def find(parent, x):
if parent[x] != x:
parent[x] = find(parent, parent[x])
return parent[x]
return x
def union(parent, a, b):
pa = find(parent, a)
pb = find(parent, b)
if pa == pb:
return False
parent[pa] = pb
return True
def solution(n, adj):
# 비용으로 정렬
adj.sort(key=lambda x:x[4])
parent =[i for i in range(n + 1)]
sum_val = 0
cnt = 0
for gender_v, gender_u, v, u, cost in adj:
if cnt == n - 1:
break
# 출발점과 도착점의 성별이 같으면 union 진행하지 않는다.
if gender_v == gender_u:
continue
if union(parent, v, u):
sum_val += cost
cnt += 1
if sum_val == 0 or cnt != n - 1:
return -1
return sum_val
n, m = map(int, input().split())
genders = [0] + list(input().split())
adj = []
for idx in range(m):
v, u, cost = map(int, input().split())
adj.append((genders[v], genders[u], v, u, cost))
print(solution(n, adj))
728x90
반응형
'PS > 백준' 카테고리의 다른 글
[백준/BOJ] 4233번 - 가짜 소수 (Python) (0) | 2023.11.02 |
---|---|
[백준/BOJ] 27172번 - 수 나누기 게임 (Python) (0) | 2023.10.28 |
[백준/BOJ] 27172번 - 수 나누기 게임 (Python) (1) | 2023.10.17 |
[백준/BOJ] 1005번 - ACM Craft (Python) (1) | 2023.09.30 |
[백준/BOJ] 2623번 - 음악프로그램 (Python) (0) | 2023.09.29 |