Skip to content

Commit c3a61bd

Browse files
committed
[Gold III] Title: 나만 안되는 연애, Time: 24 ms, Memory: 80136 KB -BaekjoonHub
1 parent db27236 commit c3a61bd

2 files changed

Lines changed: 110 additions & 0 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# [Gold III] 나만 안되는 연애 - 14621
2+
3+
[문제 링크](https://www.acmicpc.net/problem/14621)
4+
5+
### 성능 요약
6+
7+
메모리: 80136 KB, 시간: 24 ms
8+
9+
### 분류
10+
11+
그래프 이론, 최소 스패닝 트리
12+
13+
### 제출 일자
14+
15+
2025년 12월 7일 18:36:17
16+
17+
### 문제 설명
18+
19+
<p dir="ltr">깽미는 24살 모태솔로이다. 깽미는 대마법사가 될 순 없다며 자신의 프로그래밍 능력을 이용하여 미팅 어플리케이션을 만들기로 결심했다. 미팅 앱은 대학생을 타겟으로 만들어졌으며 대학교간의 도로 데이터를 수집하여 만들었다.</p>
20+
21+
<p dir="ltr">이 앱은 사용자들을 위해 사심 경로를 제공한다. 이 경로는 3가지 특징을 가지고 있다.</p>
22+
23+
<ol dir="ltr">
24+
<li>사심 경로는 사용자들의 사심을 만족시키기 위해 남초 대학교와 여초 대학교들을 연결하는 도로로만 이루어져 있다.</li>
25+
<li>사용자들이 다양한 사람과 미팅할 수 있도록 어떤 대학교에서든 모든 대학교로 이동이 가능한 경로이다.</li>
26+
<li>시간을 낭비하지 않고 미팅할 수 있도록 이 경로의 길이는 최단 거리가 되어야 한다.</li>
27+
</ol>
28+
29+
<p>만약 도로 데이터가 만약 왼쪽의 그림과 같다면, 오른쪽 그림의 보라색 선과 같이 경로를 구성하면 위의 3가지 조건을 만족하는 경로를 만들 수 있다.</p>
30+
31+
<p style="text-align:center"><img alt="" src="https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/problem/14621/1.png" style="height:128px; width:345px"></p>
32+
33+
<p>이때, 주어지는 거리 데이터를 이용하여 사심 경로의 길이를 구해보자.</p>
34+
35+
### 입력
36+
37+
<p dir="ltr">입력의 첫째 줄에 학교의 수 N와 학교를 연결하는 도로의 개수 M이 주어진다. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000)</p>
38+
39+
<p dir="ltr">둘째 줄에 각 학교가 남초 대학교라면 M, 여초 대학교라면 W이 주어진다.</p>
40+
41+
<p>다음 M개의 줄에 u v d가 주어지며 u학교와 v학교가 연결되어 있으며 이 거리는 d임을 나타낸다. (1 ≤ u, v ≤ N) , (1 ≤ d ≤ 1,000)</p>
42+
43+
### 출력
44+
45+
<p>깽미가 만든 앱의 경로 길이를 출력한다. (모든 학교를 연결하는 경로가 없을 경우 -1을 출력한다.)</p>
46+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import Foundation
2+
3+
let nm = readLine()!.split { $0 == " " }.map { Int(String($0))! },
4+
n = nm[0],
5+
m = nm[1]
6+
7+
let genders = readLine()!.split { $0 == " " }.map { String($0) }
8+
9+
var edges = [Edge]()
10+
11+
for _ in 0..<m {
12+
let uvd = readLine()!.split { $0 == " " }.map { Int(String($0))! },
13+
u = uvd[0]-1,
14+
v = uvd[1]-1,
15+
d = uvd[2]
16+
edges.append(Edge(g: u, v: v, cost: d))
17+
}
18+
19+
edges.sort { $0.cost < $1.cost }
20+
21+
var parent = Array(0..<n)
22+
23+
var totalCost = 0
24+
25+
for edge in edges {
26+
if find(edge.g) == find(edge.v) { continue }
27+
if genders[edge.g] == "M" && genders[edge.v] == "M" { continue }
28+
if genders[edge.g] == "W" && genders[edge.v] == "W" { continue }
29+
30+
union(edge.g, edge.v)
31+
32+
totalCost += edge.cost
33+
}
34+
35+
let isAllConnected = Set(parent.map { find($0) }).count == 1
36+
print(isAllConnected ? totalCost : -1)
37+
38+
struct Edge {
39+
let g: Int
40+
let v: Int
41+
let cost: Int
42+
}
43+
44+
func union(_ g: Int, _ v: Int) {
45+
var g = parent[g]
46+
var v = parent[v]
47+
48+
if g == v {
49+
return
50+
}
51+
52+
if g < v {
53+
swap(&g, &v)
54+
}
55+
56+
parent[v] = g
57+
}
58+
59+
func find(_ g: Int) -> Int {
60+
if parent[g] == g { return g }
61+
parent[g] = find(parent[g])
62+
63+
return parent[g]
64+
}

0 commit comments

Comments
 (0)