사용 알고리즘: 다익스트라
사용 언어: java
package ssafyAlgorithm;
import java.io.*;
import java.util.*;
public class Main_bj_1238_파티 {
static int n, m, x, ans;
static ArrayList<int[]>[] go, back;
public static void main(String[] args) {
input_1238();
int dpGo[] = dijkstra(go); //각 정점에서 x로 가는 최소 거리
int dpBack[] = dijkstra(back); //x에서 각 정점으로 가는 최소 거리
for (int i = 0; i < n+1; i++) {
ans = Math.max(ans, dpGo[i] + dpBack[i]);
}
System.out.println(ans);
}
private static int[] dijkstra(ArrayList<int[]>[] map) {
int[] dp = new int[n+1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[x] = 0;
PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)-> o1[1] - o2[1]);
pq.add(new int[] {x, 0});
while(!pq.isEmpty()) {
int[] cur = pq.poll();
for(int[] nxt : map[cur[0]]) {
if(dp[nxt[0]] > dp[cur[0]] + nxt[1]) {
dp[nxt[0]] = dp[cur[0]] + nxt[1];
pq.add(new int[] {nxt[0], dp[nxt[0]]});
}
}
}
// System.out.println(Arrays.toString(dp));
return dp;
}
private static void input_1238() {
Scanner sc = new Scanner(System.in);
n = sc.nextInt(); //마을 개수 = 학생 개수
m = sc.nextInt(); //도로 개수
x = sc.nextInt(); //레츠고 파티
go = new ArrayList[n+1]; //1~n인덱스 사용
back = new ArrayList[n+1];
for (int i = 0; i < n+1; i++) {
go[i] = new ArrayList<>();
back[i] = new ArrayList<>();
}
// dpGo = new int[n+1];
// dpBack = new int[n+1];
for (int i = 0; i < m; i++) {
int s = sc.nextInt();
int e = sc.nextInt();
int val = sc.nextInt();
go[s].add(new int[] {e, val}); //각 정점에서 x로 가는 최소 거리
back[e].add(new int[] {s, val}); //x에서 각 정점으로 가는 최소 거리
}
}
}
다익스트라 문제 중에, 위에 문제처럼
단방향 그래프이면서, 역방향 그래프를 따로 두어 계산해야 하는 문제가 꽤 있는 거 같다.
코딩적인 연습이 필요하다기 보다는, 이 문제 풀이법을 잘 이해하고, 암기해서 활용하는 게 중요할 듯 하다!!
'알고리즘 > 백준' 카테고리의 다른 글
1799_비숍 *****(메모리 초과) (1) | 2024.08.27 |
---|---|
2636_치즈 (0) | 2024.08.23 |
15961_회전 초밥 (0) | 2024.08.22 |
1697_숨바꼭질 * (맞았는데 다시 풀면 또 틀리려나;) (0) | 2024.08.22 |
15683_감시 (0) | 2024.08.20 |