Skip to content

Commit cc935e8

Browse files
committed
[Gold IV] Title: 발전소 설치, Time: 36 ms, Memory: 80208 KB -BaekjoonHub
1 parent f9f0c17 commit cc935e8

2 files changed

Lines changed: 105 additions & 0 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# [Gold IV] 발전소 설치 - 1277
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1277)
4+
5+
### 성능 요약
6+
7+
메모리: 80208 KB, 시간: 36 ms
8+
9+
### 분류
10+
11+
그래프 이론, 최단 경로, 데이크스트라
12+
13+
### 제출 일자
14+
15+
2026년 1월 18일 17:29:43
16+
17+
### 문제 설명
18+
19+
<p>엄청난 벼락을 맞아 많은 전선들이 끊어져 현재 전력 공급이 중단된 상태이다. 가장 심각한 문제는 1번 발전소에서 N번 발전소로 가는 중간의 전선이 끊어진 것이기에 일단 이 두 발전소를 다시 연결하는게 현재 해결해야할 첫 번째 과제이다.</p>
20+
21+
<p>발전소는 1번부터 N번까지 번호로 매겨져 2차원 격자 좌표 위에 있다. 그리고 몇몇 전선은 보존된 채 몇몇 발전소를 잇고 있다. 문제는 현재 전선과 발전소의 위치가 주어졌을 때 최소의 전선 길이를 추가로 사용하여 1번 발전소와 N번 발전소를 연결짓는 것이다. 물론 연결 짓는 중간에 다른 발전소를 거쳐갈 수 있다. 단, 안정성 문제로 어떠한 두 발전소 사이의 전선의 길이가 M을 초과할 수는 없다. 아래에 이에 대한 예를 그려놓았다.</p>
22+
23+
<pre> 연결 전 연결 후
24+
25+
3 . . . 7 9 . . . . . 3 . . . 7 9 . . . . .
26+
/
27+
2 . . 5 6 . . . . . . 2 . . 5 6 . . . . . .
28+
/
29+
1 2-3-4 . 8 . . . . . 1 2-3-4 . 8 . . . . .
30+
| |
31+
0 1 . . . . . . . . . 0 1 . . . . . . . . .
32+
33+
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
34+
</pre>
35+
36+
### 입력
37+
38+
<p>첫 줄에는 발전소의 수 N(1 ≤ N ≤ 1,000)과 현재 남아있는 전선의 수 W(1≤ W ≤ 10,000)가 주어진다. 두 번째 줄에는 제한 길이 M(0.0 < M < 200,000.0)가 주어진다. 다음 N개의 줄에는 1번 발전소부터 N번 발전소까지 각각의 발전소의 X좌표와 Y좌표(-100,000 ≤ xi,yi ≤ 100,000)가 차례대로 주어진다. 다음 W개의 줄에 대해 각 줄에는 두 개의 정수가 입력되어지는데 이는 현재 남아있는 전선이 잇고 있는 두 발전소를 의미한다.</p>
39+
40+
### 출력
41+
42+
<p>첫 줄에 1번 발전소와 N번 발전소를 잇는데 필요한 추가 전선 길이의 최솟값을 1000배하여 출력한다. (단, 1000배하고 난 후 나머지 소수는 반올림이 아닌 버림을 한다)</p>
43+
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import Foundation
2+
3+
let first = readLine()!.split(separator: " ").map { Int($0)! }
4+
let N = first[0]
5+
let W = first[1]
6+
7+
let M = Double(readLine()!)!
8+
9+
var pos = [(Double, Double)]()
10+
for _ in 0..<N {
11+
let p = readLine()!.split(separator: " ").map { Double($0)! }
12+
pos.append((p[0], p[1]))
13+
}
14+
15+
var adj = Array(repeating: [(Int, Double)](), count: N)
16+
17+
for _ in 0..<W {
18+
let e = readLine()!.split(separator: " ").map { Int($0)! - 1 }
19+
adj[e[0]].append((e[1], 0.0))
20+
adj[e[1]].append((e[0], 0.0))
21+
}
22+
23+
let INF = Double.greatestFiniteMagnitude
24+
var dist = Array(repeating: INF, count: N)
25+
dist[0] = 0.0
26+
27+
var pq = [(Double, Int)]()
28+
pq.append((0.0, 0))
29+
30+
while !pq.isEmpty {
31+
pq.sort { $0.0 < $1.0 }
32+
let (curCost, u) = pq.removeFirst()
33+
34+
if curCost > dist[u] { continue }
35+
if u == N - 1 { break }
36+
37+
for (v, cost) in adj[u] {
38+
let nd = curCost + cost
39+
if nd < dist[v] {
40+
dist[v] = nd
41+
pq.append((nd, v))
42+
}
43+
}
44+
45+
for v in 0..<N {
46+
if v == u { continue }
47+
let dx = pos[u].0 - pos[v].0
48+
let dy = pos[u].1 - pos[v].1
49+
let d = sqrt(dx*dx + dy*dy)
50+
51+
if d <= M {
52+
let nd = curCost + d
53+
if nd < dist[v] {
54+
dist[v] = nd
55+
pq.append((nd, v))
56+
}
57+
}
58+
}
59+
}
60+
61+
let result = Int(dist[N - 1] * 1000.0)
62+
print(result)

0 commit comments

Comments
 (0)