Skip to content

Commit 464af71

Browse files
committed
[Gold I] Title: 달빛 여우, Time: 772 ms, Memory: 69420 KB -BaekjoonHub
1 parent 6abf8c5 commit 464af71

2 files changed

Lines changed: 154 additions & 0 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Gold I] 달빛 여우 - 16118
2+
3+
[문제 링크](https://www.acmicpc.net/problem/16118)
4+
5+
### 성능 요약
6+
7+
메모리: 69420 KB, 시간: 772 ms
8+
9+
### 분류
10+
11+
데이크스트라, 그래프 이론, 최단 경로
12+
13+
### 제출 일자
14+
15+
2025년 4월 7일 19:44:16
16+
17+
### 문제 설명
18+
19+
<p>관악산 기슭에는 보름달을 기다리는 달빛 여우가 한 마리 살고 있다. 달빛 여우가 보름달의 달빛을 받으면 아름다운 구미호로 변신할 수 있다. 하지만 보름달을 기다리는 건 달빛 여우뿐만이 아니다. 달빛을 받아서 멋진 늑대인간이 되고 싶어 하는 달빛 늑대도 한 마리 살고 있다.</p>
20+
21+
<p>관악산에는 1번부터 <em>N</em>번까지의 번호가 붙은 <em>N</em>개의 나무 그루터기가 있고, 그루터기들 사이에는 <em>M</em>개의 오솔길이 나 있다. 오솔길은 어떤 방향으로든 지나갈 수 있으며, 어떤 두 그루터기 사이에 두 개 이상의 오솔길이 나 있는 경우는 없다. 달빛 여우와 달빛 늑대는 1번 나무 그루터기에서 살고 있다.</p>
22+
23+
<p>보름달이 뜨면 나무 그루터기들 중 하나가 달빛을 받아 밝게 빛나게 된다. 그러면 달빛 여우와 달빛 늑대는 먼저 달빛을 독차지하기 위해 최대한 빨리 오솔길을 따라서 그 그루터기로 달려가야 한다. 이때 달빛 여우는 늘 일정한 속도로 달려가는 반면, 달빛 늑대는 달빛 여우보다 더 빠르게 달릴 수 있지만 체력이 부족하기 때문에 다른 전략을 사용한다. 달빛 늑대는 출발할 때 오솔길 하나를 달빛 여우의 두 배의 속도로 달려가고, 그 뒤로는 오솔길 하나를 달빛 여우의 절반의 속도로 걸어가며 체력을 회복하고 나서 다음 오솔길을 다시 달빛 여우의 두 배의 속도로 달려가는 것을 반복한다. 달빛 여우와 달빛 늑대는 각자 가장 빠르게 달빛이 비치는 그루터기까지 다다를 수 있는 경로로 이동한다. 따라서 둘의 이동 경로가 서로 다를 수도 있다.</p>
24+
25+
<p>출제자는 관악산의 모든 동물을 사랑하지만, 이번에는 달빛 여우를 조금 더 사랑해 주기로 했다. 그래서 달빛 여우가 달빛 늑대보다 먼저 도착할 수 있는 그루터기에 달빛을 비춰 주려고 한다. 이런 그루터기가 몇 개나 있는지 알아보자.</p>
26+
27+
### 입력
28+
29+
<p>첫 줄에 나무 그루터기의 개수와 오솔길의 개수를 의미하는 정수 <em>N</em>, <em>M</em>(2 ≤ <em>N</em> ≤ 4,000, 1 ≤ <em>M</em> ≤ 100,000)이 주어진다.</p>
30+
31+
<p>두 번째 줄부터 <em>M</em>개의 줄에 걸쳐 각 줄에 세 개의 정수 <em>a</em>, <em>b</em>, <em>d</em>(1 ≤ <em>a</em>, <em>b</em> ≤ <em>N</em>, <em>a</em> ≠ <em>b</em>, 1 ≤ <em>d</em> ≤ 100,000)가 주어진다. 이는 <em>a</em>번 그루터기와 <em>b</em>번 그루터기 사이에 길이가 <em>d</em>인 오솔길이 나 있음을 의미한다.</p>
32+
33+
### 출력
34+
35+
<p>첫 줄에 달빛 여우가 달빛 늑대보다 먼저 도착할 수 있는 나무 그루터기의 개수를 출력한다.</p>
36+
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
static long MAX = 4000000000L;
6+
static List<node>[] graph;
7+
static int n, m, ans;
8+
static long[] f;
9+
static long[][] w;
10+
static StringTokenizer st;
11+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
12+
public static void main(String[] args) throws Exception{
13+
inputSetting();
14+
foxdijkstra();
15+
wolfdijkstra();
16+
17+
for(int i = 2; i < n + 1; i++){
18+
if(f[i] < Math.min(w[i][0], w[i][1])) ans++;
19+
}
20+
System.out.println(ans);
21+
}
22+
23+
static void foxdijkstra(){
24+
PriorityQueue<node> q = new PriorityQueue<>();
25+
q.add(new node(1, 0)); // 여우
26+
f[1] = 0;
27+
28+
node now;
29+
while(!q.isEmpty()){
30+
now = q.poll();
31+
if(f[now.n] < now.d) continue;
32+
33+
for(node next : graph[now.n]) {
34+
if (f[next.n] <= f[now.n] + next.d) continue;
35+
36+
f[next.n] = f[now.n] + next.d;
37+
q.add(new node(next.n, f[next.n], now.speedUp));
38+
}
39+
}
40+
}
41+
42+
static void wolfdijkstra(){
43+
PriorityQueue<node> q = new PriorityQueue<>();
44+
q.add(new node(1, 0, 1)); // 늑대
45+
w[1][1] = 0;
46+
47+
long s;
48+
node now;
49+
while(!q.isEmpty()){
50+
now = q.poll();
51+
52+
if(w[now.n][now.speedUp] < now.d) continue;
53+
54+
for(node next : graph[now.n]) {
55+
56+
if(now.speedUp == 1) s = next.d / 2;
57+
else s = next.d * 2;
58+
59+
if(w[next.n][1 - now.speedUp] <= now.d + s) continue;
60+
61+
w[next.n][1 - now.speedUp] = now.d + s;
62+
q.add(new node(next.n, w[next.n][1 - now.speedUp], 1 - now.speedUp));
63+
}
64+
}
65+
}
66+
67+
static void inputSetting() throws Exception{
68+
st = new StringTokenizer(br.readLine());
69+
70+
n = Integer.parseInt(st.nextToken());
71+
m = Integer.parseInt(st.nextToken());
72+
graph = new ArrayList[n + 1];
73+
f = new long[n + 1];
74+
w = new long[n + 1][2];
75+
76+
for(int i = 0; i < n + 1; i++){
77+
graph[i] = new ArrayList<>();
78+
79+
f[i] = MAX;
80+
w[i][0] = MAX;
81+
w[i][1] = MAX;
82+
}
83+
84+
int a, b, c;
85+
for(int i = 0; i < m; i++){
86+
st = new StringTokenizer(br.readLine());
87+
88+
a = Integer.parseInt(st.nextToken());
89+
b = Integer.parseInt(st.nextToken());
90+
c = Integer.parseInt(st.nextToken()) * 2;
91+
92+
graph[a].add(new node(b, c));
93+
graph[b].add(new node(a, c));
94+
}
95+
}
96+
97+
static class node implements Comparable<node>{
98+
99+
int n, speedUp;
100+
long d;
101+
102+
node(int n, long d) {
103+
this.n = n;
104+
this.d = d;
105+
}
106+
107+
node(int n, long d, int speedUp) {
108+
this.n = n;
109+
this.d = d;
110+
this.speedUp = speedUp;
111+
}
112+
113+
@Override
114+
public int compareTo(node other){
115+
return Long.compare(this.d, other.d);
116+
}
117+
}
118+
}

0 commit comments

Comments
 (0)