1 λΆ„ μ†Œμš”

πŸ“ [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초λ₯Ό λ„˜κΈ° λ•Œλ¬Έμ— λΆˆκ°€λŠ₯ν•œ 것을 μ•Œ 수 μžˆλ‹€.
κ·Έλž˜μ„œ 좜발 λ§ˆμ„μ—μ„œ νŒŒν‹° λ§ˆμ„κΉŒμ§€ ν•˜λ‚˜μ˜ λ‹€μ΅μŠ€νŠΈλΌ 리슀트λ₯Ό λ§Œλ“€κ³  νŒŒν‹° λ§ˆμ„μ—μ„œ λ‹€μ‹œ 좜발 λ§ˆμ„λ‘œ λŒμ•„μ˜€λŠ” ν•˜λ‚˜μ˜ λ‹€μ΅μŠ€νŠΈλΌλ₯Ό λ§Œλ“€μ–΄ ν•©ν•œ λ’€ κ°€μž₯ λ§Žμ€ μ‹œκ°„μ„ μ†ŒλΉ„ν•˜λŠ” 학생을 ꡬ해주면 λœλ‹€.