Skip to content

Commit 93e3d18

Browse files
committed
[Gold III] Title: 파티, Time: 752 ms, Memory: 89864 KB -BaekjoonHub
1 parent deb7125 commit 93e3d18

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Gold III] 파티 - 1238
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1238)
4+
5+
### 성능 요약
6+
7+
메모리: 89864 KB, 시간: 752 ms
8+
9+
### 분류
10+
11+
그래프 이론, 최단 경로, 데이크스트라
12+
13+
### 제출 일자
14+
15+
2025년 7월 1일 19:25:31
16+
17+
### 문제 설명
18+
19+
<p>N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다.</p>
20+
21+
<p>어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 T<sub>i</sub>(1 ≤ T<sub>i</sub> ≤ 100)의 시간을 소비한다.</p>
22+
23+
<p>각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다.</p>
24+
25+
<p>이 도로들은 단방향이기 때문에 아마 그들이 오고 가는 길이 다를지도 모른다. N명의 학생들 중 오고 가는데 가장 많은 시간을 소비하는 학생은 누구일지 구하여라.</p>
26+
27+
### 입력
28+
29+
<p>첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 T<sub>i</sub>가 들어온다. 시작점과 끝점이 같은 도로는 없으며, 시작점과 한 도시 A에서 다른 도시 B로 가는 도로의 개수는 최대 1개이다.</p>
30+
31+
<p>모든 학생들은 집에서 X에 갈수 있고, X에서 집으로 돌아올 수 있는 데이터만 입력으로 주어진다.</p>
32+
33+
### 출력
34+
35+
<p>첫 번째 줄에 N명의 학생들 중 오고 가는데 가장 오래 걸리는 학생의 소요시간을 출력한다.</p>
36+
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.Comparator;
7+
import java.util.LinkedList;
8+
import java.util.PriorityQueue;
9+
import java.util.Queue;
10+
import java.util.StringTokenizer;
11+
12+
public class Main {
13+
14+
static int N,M,X;
15+
static ArrayList<int []> A[];
16+
static int INF = Integer.MAX_VALUE;
17+
public static void main(String[] args) throws IOException {
18+
19+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
20+
21+
StringTokenizer st = new StringTokenizer(br.readLine());
22+
23+
N = Integer.parseInt(st.nextToken());
24+
M = Integer.parseInt(st.nextToken());
25+
X = Integer.parseInt(st.nextToken());
26+
27+
A = new ArrayList[N+1];
28+
29+
for(int i =1; i<=N; i++) {
30+
A[i] = new ArrayList<>();
31+
}
32+
33+
for(int i =0; i<M; i++) {
34+
st = new StringTokenizer(br.readLine());
35+
36+
int u = Integer.parseInt(st.nextToken());
37+
int v = Integer.parseInt(st.nextToken());
38+
int w = Integer.parseInt(st.nextToken());
39+
40+
A[u].add(new int[]{ v,w});
41+
}
42+
43+
int answer = Integer.MIN_VALUE;
44+
for(int i =1; i<=N; i++) {
45+
if(i ==X) continue;
46+
answer = Math.max(answer, dijkstra(i, X) + dijkstra(X, i));
47+
}
48+
49+
System.out.println(answer);
50+
}
51+
static int dijkstra(int startNode, int endNode) {
52+
53+
int diff[] = new int[N+1];
54+
55+
Arrays.fill(diff, INF);
56+
57+
diff[startNode] = 0;
58+
59+
PriorityQueue<int []> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
60+
61+
pq.add(new int[] {startNode, 0});
62+
63+
while(!pq.isEmpty()) {
64+
65+
int now[] = pq.poll();
66+
67+
int currentNode= now[0];
68+
int currentValue = now[1];
69+
70+
if(diff[currentNode] < currentValue) {
71+
continue;
72+
}
73+
for(int next[]: A[currentNode]) {
74+
int nextNode = next[0];
75+
int nextValue = next[1];
76+
77+
if(diff[nextNode] > diff[currentNode] + nextValue) {
78+
diff[nextNode] = diff[currentNode] + nextValue;
79+
pq.add(new int[] {nextNode, diff[nextNode]});
80+
}
81+
}
82+
}
83+
return diff[endNode];
84+
}
85+
}

0 commit comments

Comments
 (0)