BOJ_G3_1238
π [G3_1238] νν°
import java.util.*;
import java.io.*;
public class Main {
static int N,M,X;
static int INF = 999999999;
static ArrayList<ArrayList<Node>> nList, xList;
// λ€μ λ
Έλ μΈλ±μ€μ μμμκ°μ μ μ₯
static class Node implements Comparable<Node>{
int idx,time;
Node(int idx, int time){
this.idx = idx;
this.time = time;
}
@Override
public int compareTo(Node o) {
return this.time - o.time;
}
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// νμ μ & λ§μ μ
N = Integer.parseInt(st.nextToken());
// λλ‘ μ
M = Integer.parseInt(st.nextToken());
// νν° μ₯μ
X = Integer.parseInt(st.nextToken());
// λ¬Έμ κ·Έλλ‘
nList = new ArrayList<>();
// λ¬Έμ λ°λ
xList = new ArrayList<>();
for(int i=0; i<=N; i++) {
nList.add(new ArrayList<>());
xList.add(new ArrayList<>());
}
// λλ‘ μ 보 μ
λ ₯
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine()," ");
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int time = Integer.parseInt(st.nextToken());
// μ 보 μ μ₯
// λΆλͺ¨ ArrayListμλ μΆλ°λ²νΈκ° μμ ArrayListμλ λμ°©λ²νΈμ μμμκ°μ΄ μ μ₯
nList.get(start).add(new Node(end,time));
// λΆλͺ¨ ArrayListμλ λμ°©λ²νΈκ° μμ ArrayListμλ μΆλ°λ²νΈμ μμμκ°μ΄ μ μ₯
xList.get(end).add(new Node(start,time));
}
// λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦
int[] dist1 = dijkstra(nList);
int[] dist2 = dijkstra(xList);
// μ΅λκ° μ°ΎκΈ°
int res = 0;
for(int i=1; i<=N; i++) {
res = Math.max(res, dist1[i] + dist2[i]);
}
System.out.println(res);
}
// λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦ - P.Q μ¬μ©
static int[] dijkstra(ArrayList<ArrayList<Node>> list) {
// μ°μ μμ ν
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.offer(new Node(X,0));
// 방문체ν¬
boolean[] v = new boolean[N+1];
// μ΅μ μκ° μ μ₯ λ°°μ΄
int[] dist = new int[N+1];
// μ΅λλ‘ κ° μ μ₯
Arrays.fill(dist, INF);
dist[X] = 0;
while(!pq.isEmpty()) {
// λ€μ κ° κ³³
Node curNode = pq.poll();
int cur = curNode.idx;
// μμ§ λ°©λ¬Ένμ§ μμλ€λ©΄
if(!v[cur]) {
// λ°©λ¬Έμ²λ¦¬
v[cur] = true;
// dist κ° κ°±μ
for(Node node : list.get(cur)) {
if(!v[node.idx] && dist[node.idx] > dist[cur] + node.time) {
dist[node.idx] = dist[cur] + node.time;
pq.add(new Node(node.idx, dist[node.idx]));
}
}
}
}
return dist;
}
}
π€ λμ μκ°
κ°μ€μΉκ° μλ κ·Έλνμμ μ΅λ¨κ±°λ¦¬λ₯Ό ꡬνλ λ¬Έμ μ΄κΈ° λλ¬Έμ P.Qλ₯Ό μ΄μ©ν΄ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μκ°νλ€.
κ°λ€ μ€λ κ² κΉμ§ μκ°ν΄μΌνκΈ° λλ¬Έμ νν°μ΄λ¦¬λ κ³³μ κ²½μ μ§λ‘ μκ°νκ³ νλ‘μ΄λ μμ¬ μκ³ λ¦¬μ¦λ μ¬μ©ν μ μκ² λ€ μκ° νμ§λ§ νλ‘μ΄λ μμ¬ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ OΒ³μ΄κΈ° λλ¬Έμ 1000000000μ 1μ΄λ₯Ό λκΈ° λλ¬Έμ λΆκ°λ₯ν κ²μ μ μ μλ€.
κ·Έλμ μΆλ° λ§μμμ νν° λ§μκΉμ§ νλμ λ€μ΅μ€νΈλΌ 리μ€νΈλ₯Ό λ§λ€κ³ νν° λ§μμμ λ€μ μΆλ° λ§μλ‘ λμμ€λ νλμ λ€μ΅μ€νΈλΌλ₯Ό λ§λ€μ΄ ν©ν λ€ κ°μ₯ λ§μ μκ°μ μλΉνλ νμμ ꡬν΄μ£Όλ©΄ λλ€.