728x90
https://www.acmicpc.net/problem/14621
14621번: 나만 안되는 연애
입력의 첫째 줄에 학교의 수 N와 학교를 연결하는 도로의 개수 M이 주어진다. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000) 둘째 줄에 각 학교가 남초 대학교라면 M, 여초 대학교라면 W이 주어진다. 다음 M개의
www.acmicpc.net
크루스칼을 이용해 간단하게 풀 수 있다.
만약 해당 노드끼리 성별이 같으면 continue로 넘어가주고, 성별이 다르다면 이어준다.
edge_num으로 이어진 간선의 개수를 세어주고, 중간에 모든 정점이 이어지면 break를 해준다. 만약 주어진 간선을 이용해 정점을 이었는데도 모든 정점이 이어지지 않았다면 edge_num의 개수를 체크하여 -1, 모두 이어졌다면 경로의 길이를 출력한다.
import sys
input = sys.stdin.readline
def find_p(x):
if x != p[x]:
p[x] = find_p(p[x])
return p[x]
else:
return x
N, M = map(int, input().split())
university = list(input().split())
input_list = []
p = [i for i in range(N)]
for _ in range(M):
u, v, d = map(int, input().split())
input_list.append([u-1, v-1, d])
input_list.sort(key=lambda x:x[2])
ans = 0
edge_num = 0
for i in range(M):
u, v, d = input_list[i]
if university[u] == university[v]:
continue
else:
p1 = find_p(u)
p2 = find_p(v)
if p1 == p2:
continue
else:
p[p1] = p2
ans += d
edge_num += 1
if edge_num == N - 1:
break
if edge_num == N - 1:
print(ans)
else:
print(-1)
'알고리즘' 카테고리의 다른 글
[백준] 17619. 개구리 점프 (0) | 2021.10.19 |
---|---|
[백준] 1197. 최소 스패닝 트리 (0) | 2021.10.19 |
[백준] 1043. 거짓말 (0) | 2021.10.19 |
[백준] 17352. 여러분의 다리가 되어 드리겠습니다! (0) | 2021.10.17 |
[SWEA] 2112. 보호 필름 (0) | 2021.10.17 |