[Boj_1238] ํŒŒํ‹ฐ

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/1238

 

1238๋ฒˆ: ํŒŒํ‹ฐ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ž…๋ ฅ๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ M+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ i๋ฒˆ์งธ ๋„๋กœ์˜ ์‹œ์ž‘์ , ๋์ , ๊ทธ๋ฆฌ๊ณ  ์ด ๋„๋กœ๋ฅผ ์ง€๋‚˜๋Š”๋ฐ ํ•„์š”ํ•œ ์†Œ์š”์‹œ๊ฐ„ Ti๊ฐ€ ๋“ค์–ด

www.acmicpc.net

 

โ–ธ ๋ฌธ์ œ

N๊ฐœ์˜ ์ˆซ์ž๋กœ ๊ตฌ๋ถ„๋œ ๊ฐ๊ฐ์˜ ๋งˆ์„์— ํ•œ ๋ช…์˜ ํ•™์ƒ์ด ์‚ด๊ณ  ์žˆ๋‹ค.

์–ด๋А ๋‚  ์ด N๋ช…์˜ ํ•™์ƒ์ด X (1 ≤ X ≤ N)๋ฒˆ ๋งˆ์„์— ๋ชจ์—ฌ์„œ ํŒŒํ‹ฐ๋ฅผ ๋ฒŒ์ด๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด ๋งˆ์„ ์‚ฌ์ด์—๋Š” ์ด M๊ฐœ์˜ ๋‹จ๋ฐฉํ–ฅ ๋„๋กœ๋“ค์ด ์žˆ๊ณ  i๋ฒˆ์งธ ๊ธธ์„ ์ง€๋‚˜๋Š”๋ฐ Ti(1 ≤ Ti ≤ 100)์˜ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•œ๋‹ค.

๊ฐ๊ฐ์˜ ํ•™์ƒ๋“ค์€ ํŒŒํ‹ฐ์— ์ฐธ์„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฑธ์–ด๊ฐ€์„œ ๋‹ค์‹œ ๊ทธ๋“ค์˜ ๋งˆ์„๋กœ ๋Œ์•„์™€์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ํ•™์ƒ๋“ค์€ ์›Œ๋‚™ ๊ฒŒ์„๋Ÿฌ์„œ ์ตœ๋‹จ ์‹œ๊ฐ„์— ์˜ค๊ณ  ๊ฐ€๊ธฐ๋ฅผ ์›ํ•œ๋‹ค.

์ด ๋„๋กœ๋“ค์€ ๋‹จ๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ ๊ทธ๋“ค์ด ์˜ค๊ณ  ๊ฐ€๋Š” ๊ธธ์ด ๋‹ค๋ฅผ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. N๋ช…์˜ ํ•™์ƒ๋“ค ์ค‘ ์˜ค๊ณ  ๊ฐ€๋Š”๋ฐ ๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋Š” ํ•™์ƒ์€ ๋ˆ„๊ตฌ์ผ์ง€ ๊ตฌํ•˜์—ฌ๋ผ.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ž…๋ ฅ๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ M+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ i๋ฒˆ์งธ ๋„๋กœ์˜ ์‹œ์ž‘์ , ๋์ , ๊ทธ๋ฆฌ๊ณ  ์ด ๋„๋กœ๋ฅผ ์ง€๋‚˜๋Š”๋ฐ ํ•„์š”ํ•œ ์†Œ์š”์‹œ๊ฐ„ Ti๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ์‹œ์ž‘์ ๊ณผ ๋์ ์ด ๊ฐ™์€ ๋„๋กœ๋Š” ์—†์œผ๋ฉฐ, ์‹œ์ž‘์ ๊ณผ ํ•œ ๋„์‹œ A์—์„œ ๋‹ค๋ฅธ ๋„์‹œ B๋กœ ๊ฐ€๋Š” ๋„๋กœ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 1๊ฐœ์ด๋‹ค.

๋ชจ๋“  ํ•™์ƒ๋“ค์€ ์ง‘์—์„œ X์— ๊ฐˆ์ˆ˜ ์žˆ๊ณ , X์—์„œ ์ง‘์œผ๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— N๋ช…์˜ ํ•™์ƒ๋“ค ์ค‘ ์˜ค๊ณ  ๊ฐ€๋Š”๋ฐ ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ํ•™์ƒ์˜ ์†Œ์š”์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 3
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๋ฐ์ดํฌ์ŠคํŠธ๋ผ, ์ตœ๋‹จ ๊ฒฝ๋กœ
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

  • ๋ชฉ์ ์ง€ ๋…ธ๋“œ์ธ x๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ one-to-all ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.
  • ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ
    1. ํŒŒํ‹ฐ์— ์ฐธ์„ํ•˜๋Š” ๊ฒฝ์šฐ - ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•ด x๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ
    2. ํŒŒํ‹ฐ๊ฐ€ ๋๋‚˜๊ณ  ์ง‘์œผ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒฝ์šฐ - x๋ฒˆ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋“ค๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ
  • ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•ด ๋ณด์•„์•ผ ํ•  ๊ฒฝ์šฐ๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์ธ๋ฐ,
  • ์˜ˆ๋ฅผ ๋“ค์–ด 2๋ฒˆ ๋…ธ๋“œ๋ฅผ ๋ชฉ์ ์ง€ ๋…ธ๋“œ๋กœ ์ƒ๊ฐํ•˜๋ฉด 1, 3, 4๋ฒˆ ๋…ธ๋“œ ๊ฐ๊ฐ์— ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋น„ํšจ์œจ์ ์ด๋‹ค.
  • ์ด๋Ÿฐ ๋น„ํšจ์œจ์  ๋ฐฉ๋ฒ• ๋Œ€์‹ , ๋‹จ๋ฐฉํ–ฅ ๊ฐ„์„ ์„ ๋ฐ˜๋Œ€๋กœ ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉด 2๋ฒˆ ๋…ธ๋“œ๋ฅผ ๋ชฉ์ ์ง€ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ์ถœ๋ฐœ์ง€ ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 16644KB
์‹œ๊ฐ„ : 152ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static int n, m, x;
    // ๋ชจ๋“  ๋…ธ๋“œ์—์„œ x๋ฒˆ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ๋ฐฉํ–ฅ์„ ๋ฐ˜๋Œ€๋กœ ์ €์žฅ ํ•  ๋ฆฌ์ŠคํŠธ
    static ArrayList<ArrayList<Pos>> reverseList;
    static ArrayList<ArrayList<Pos>> list;
    static int[] reverseDist;
    static int[] dist;
    static boolean[] checked;
    static PriorityQueue<Pos> pq;
    static public class Pos implements Comparable<Pos> {
        int end; int dist;
        public Pos(int end, int dist) {
            this.end = end; this.dist = dist;
        }
        @Override
        public int compareTo(Pos o) {
            return this.dist - o.dist;
        }
    }
    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()); // ๋ชฉ์ ์ง€

        reverseList = new ArrayList<>();
        list = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            reverseList.add(new ArrayList<>());
            list.add(new ArrayList<>());
        }

        int u, v, w;
        while (m --> 0) {
            st = new StringTokenizer(br.readLine());
            u = Integer.parseInt(st.nextToken());
            v = Integer.parseInt(st.nextToken());
            w = Integer.parseInt(st.nextToken());

            // ๋ชฉ์ ์ง€๋ฅผ ์ถœ๋ฐœ์ง€๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ ๋ฐ˜๋Œ€๋กœ ์ €์žฅ
            reverseList.get(v).add(new Pos(u, w));
            // ์ง‘์œผ๋กœ ๋˜๋Œ์•„ ์˜ค๊ธฐ - ์ž…๋ ฅ ๊ทธ๋Œ€๋กœ ์ €์žฅ
            list.get(u).add(new Pos(v, w));
        }

        reverseDist = new int[n+1];
        Arrays.fill(reverseDist, Integer.MAX_VALUE);
        Dijkstra(reverseList, reverseDist, x);
        dist = new int[n+1];
        Arrays.fill(dist, Integer.MAX_VALUE);
        Dijkstra(list, dist, x);

        int ans = 0;
        for (int i = 1; i <= n; i++) {
            ans = Math.max(ans, reverseDist[i]+dist[i]);
        }
        System.out.println(ans);
    }

    private static void Dijkstra(ArrayList<ArrayList<Pos>> list, int[] dist, int start) {
        checked = new boolean[n+1];
        pq = new PriorityQueue<>();
        pq.offer(new Pos(start, 0));
        dist[start] = 0;

        while (!pq.isEmpty()) {
            int end = pq.poll().end;

            if (checked[end]) continue;
            checked[end] = true;

            for (Pos next : list.get(end)) {
                if (dist[next.end] > dist[end]+ next.dist) {
                    dist[next.end] = dist[end]+ next.dist;
                    pq.offer(new Pos(next.end, dist[next.end]));
                }
            }
        }
    }
}