본문 바로가기
PS/백준

[백준/BOJ] 14621번 - 나만 안되는 연애 (Python)

by 행복한라이언 2023. 10. 21.
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
반응형