[Boj_20160] ์•ผ์ฟ ๋ฅดํŠธ ์•„์คŒ๋งˆ ์•ผ์ฟ ๋ฅดํŠธ ์ฃผ์„ธ์š”

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

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

 

โ–ธ ๋ฌธ์ œ

์•ผ์ฟ ๋ฅดํŠธ๋ฅผ ์™ธ์น˜๋ฉฐ ์ž ์—์„œ ๊นผ๋‹ค. ์˜ค๋Š˜์€ ์•ผ์ฟ ๋ฅดํŠธ๋กœ ํ•˜๋ฃจ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์•ผ์ฟ ๋ฅดํŠธ ์•„์คŒ๋งˆ๋Š” 10๊ฐœ์˜ ์ง€์ ์„ ์ตœ๋‹จ ์‹œ๊ฐ„์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ๋“ค๋ฆฌ์‹ ๋‹ค. ๊ฐ ์ง€์ ์—์„œ ์•ผ์ฟ ๋ฅดํŠธ ์•„์คŒ๋งˆ๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ๋” ์ผ์ฐ ๋„์ฐฉํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ์•ผ์ฟ ๋ฅดํŠธ๋ฅผ ํŒ”๊ณ  ๋ฐ”๋กœ ๋‹ค์Œ ์ง€์ ์œผ๋กœ ์ถœ๋ฐœํ•˜์‹ ๋‹ค. ๊ฐ ์ง€์ ์€ ์ •์  ์œ„์— ์žˆ๊ณ  ์ง€์ •๋œ ์ฐจ๋ก€์—๋งŒ ์•ผ์ฟ ๋ฅดํŠธ๋ฅผ ํŒ๋งคํ•œ๋‹ค. ์•ผ์ฟ ๋ฅดํŠธ๋ฅผ ํŒŒ๋Š” ๋ฐ ์ง€์—ฐ๋˜๋Š” ์‹œ๊ฐ„์€ ์—†์œผ๋ฉฐ, ์˜ค์ง ์ด๋™ ์‹œ์—๋งŒ ํ•ด๋‹น ๋„๋กœ์˜ ๊ฐ€์ค‘์น˜๋งŒํผ ์‹œ๊ฐ„์ด ์ง€์—ฐ๋œ๋‹ค.

์•ผ์ฟ ๋ฅดํŠธ ์•„์คŒ๋งˆ๋Š” 10๊ฐœ์˜ ์ง€์ ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉฐ, 10๊ฐœ์˜ ์ง€์  ์ค‘ ์ฒซ ๋ฒˆ์งธ ์ง€์ ์—์„œ ์ถœ๋ฐœํ•œ๋‹ค. ๋งŒ์•ฝ i๋ฒˆ์งธ ์ง€์ ์—์„œ i+1๋ฒˆ์งธ ์ง€์ ์œผ๋กœ ์ด๋™ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค๋ฉด i+2์ง€์ ์œผ๋กœ ์ด๋™ํ•˜์‹ ๋‹ค. i+2๋กœ ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฉด i+3, i+4...(≤ V)๋กœ ์ด๋™ํ•˜์‹ ๋‹ค.

๋‚ด๊ฐ€ ์ถœ๋ฐœํ•˜๋Š” ์‹œ๊ฐ„๊ณผ ์•ผ์ฟ ๋ฅดํŠธ ์•„์คŒ๋งˆ๊ฐ€ ์ถœ๋ฐœํ•˜๋Š” ์‹œ๊ฐ„์€ ๊ฐ™๋‹ค.

๋‚ด๊ฐ€ ์ถœ๋ฐœํ•˜๋Š” ์ •์  ๋ฒˆํ˜ธ์™€ ์•ผ์ฟ ๋ฅดํŠธ ์•„์คŒ๋งˆ์˜ ๋™์„ ์„ ์•Œ๋ ค์ฃผ๋ฉด ์–ด๋А ์ง€์ ์œผ๋กœ ๊ฐ€์•ผ ์•ผ์ฟ ๋ฅดํŠธ๋ฅผ ์‚ด ์ˆ˜ ์žˆ์„์ง€ ์•Œ๋ ค์ค˜!!

 

โ–ธ ์ž…๋ ฅ

์ฒซ ์ค„์—๋Š” ์ •์ ์˜ ๊ฐœ์ˆ˜ V(1 ≤ V ≤ 10,000)์™€ ๋„๋กœ์˜ ๊ฐœ์ˆ˜ E(0 ≤ E ≤ 100,000)๊ฐ€ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค.

๊ทธ ๋‹ค์Œ E ์ค„์— ๊ฑธ์ณ ๊ฐ ๋„๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ (u, v, w)๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” u ์™€ v(1 ≤ u, v  V) ์‚ฌ์ด์— ๊ฐ€์ค‘์น˜๊ฐ€ w(1 ≤ w ≤ 100,000)์ธ ๋„๋กœ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ •์  ์‚ฌ์ด์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ„์„ ์ด ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์Œ์— ์œ ์˜ํ•œ๋‹ค.

E+2๋ฒˆ์งธ ์ค„์—๋Š” ์•ผ์ฟ ๋ฅดํŠธ ์•„์คŒ๋งˆ๊ฐ€ ์•ผ์ฟ ๋ฅดํŠธ๋ฅผ ํŒŒ๋Š” 10๊ฐœ ์ง€์ ์˜ ์ •์  ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. E+3๋ฒˆ์งธ ์ค„์—๋Š” ๋‚ด๊ฐ€ ์ถœ๋ฐœํ•˜๋Š” ์ •์  ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์•ผ์ฟ ๋ฅดํŠธ๋ฅผ ์‚ด ์ˆ˜ ์žˆ๋Š” ์ •์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ทธ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์ •์  ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์•ผ์ฟ ๋ฅดํŠธ๋ฅผ ์‚ด ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

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

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

 

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

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

๋จผ์ €, ์•ผ์ฟ ๋ฅดํŠธ ์•„์คŒ๋งˆ๊ฐ€ 10๊ฐœ์˜ ์ง€์ ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•  ๋•Œ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•œ๋‹ค.

 

์ด๋•Œ, ์•„์คŒ๋งˆ๊ฐ€ i ๋ฒˆ์งธ ์ง€์ ์—์„œ i+1๋ฒˆ์งธ ์ง€์ ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

์ฆ‰, ๋น„์šฉ์ด INF์ธ ๊ฒฝ์šฐ๋ผ๋ฉด i+2๋ฒˆ์งธ ์ง€์ ์œผ๋กœ ๊ฐ€์•ผ ํ•œ๋‹ค.

 

๋˜ํ•œ, ์—ฌ๊ธฐ์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋น„์šฉ์˜ ์ตœ๋Œ“๊ฐ’์€ 10,000(์ตœ๋Œ€ ์ •์ ์˜ ๊ฐœ์ˆ˜) * 100,000(๊ฐ€์ค‘์น˜ ์ตœ๋Œ“๊ฐ’) = 10์–ต์ด๋‹ค.

์•„์คŒ๋งˆ๊ฐ€ 1 โžก 2 โžก 1 โžก 2 โžก 1๋กœ ์ง€์ ์„ ๋ฐฉ๋ฌธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž

1 โžก 2๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ๋น„์šฉ์ด ์ตœ์•…์œผ๋กœ 10์–ต์ด๊ณ , 2 โžก 1๋กœ ๊ฐ€๋Š” ๋น„์šฉ๋„ ์ตœ์•…์œผ๋กœ 10์–ต์ด๋ผ๋ฉด

์•„์คŒ๋งˆ๊ฐ€ ์ง€์ ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ๋ˆ„์ ๋˜๋Š” ์‹œ๊ฐ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1 โžก 2 : 10์–ต

2 โžก 1 : (์ด์ „ 10์–ต) + 10์–ต

1 โžก 2 : (์ด์ „ 20์–ต) + 10์–ต

2 โžก 1:  (์ด์ „ 30์–ต) + 10์–ต

์ฆ‰, ์•„์คŒ๋งˆ๊ฐ€ ์ง€์ ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ์ด์ „ ๋ฐฉ๋ฌธ ์‹œ๊ฐ„๊นŒ์ง€ ๊ฐ™์ด ๋ˆ„์ ํ•ด์„œ ์ €์žฅํ•ด ์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

์ตœ์•…์˜ ๊ฒฝ์šฐ intํ˜•์˜ ๋ฒ”์œ„๋ฅผ ๋„˜๊ฒŒ ๋˜๋ฏ€๋กœ longํ˜•์œผ๋กœ ์„ ์–ธํ•˜์—ฌ ๊ฐ’์„ ๋ˆ„์ ํ•ด์„œ ๋”ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ๋Š” ๋‚ด๊ฐ€ ์ถœ๋ฐœํ•˜๋Š” ์ง€์ ์—์„œ ๋‹ค๋ฅธ ์ง€์ ๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•œ๋‹ค.

 

์•„์คŒ๋งˆ๊ฐ€ i ๋ฒˆ์งธ ์ง€์ ์— ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๊ณ ,

๋‚ด๊ฐ€ ์•„์คŒ๋งˆ๋ณด๋‹ค i ๋ฒˆ์งธ ์ง€์ ์— ๋จผ์ € ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ •๋‹ต์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

 

์œ„ ํ’€์ด๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

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

๋ฉ”๋ชจ๋ฆฌ : 67096KB
์‹œ๊ฐ„ : 700ms
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 v, e;
    static ArrayList<ArrayList<Pos>> list;
    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;
        }
    }
    static final int INF = Integer.MAX_VALUE;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        v = Integer.parseInt(st.nextToken()); // ์ •์ ์˜ ๊ฐœ์ˆ˜
        e = Integer.parseInt(st.nextToken()); // ๋„๋กœ์˜ ๊ฐœ์ˆ˜

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

        int u, v, w;
        for (int i = 0; i < e; i++) {
            st = new StringTokenizer(br.readLine());
            u = Integer.parseInt(st.nextToken());
            v = Integer.parseInt(st.nextToken());
            w = Integer.parseInt(st.nextToken());

            list.get(u).add(new Pos(v, w));
            list.get(v).add(new Pos(u, w));
        }

        // ์•ผ์ฟ ๋ฅดํŠธ ์•„์คŒ๋งˆ๊ฐ€ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœ์„œ
        int[] yogurtNode = new int[10];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < 10; i++) {
            yogurtNode[i] = Integer.parseInt(st.nextToken());
        }

        // i๋ฒˆ์งธ ์ง€์ ๊นŒ์ง€ ์˜ค๋Š”๋ฐ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„
        long[] yogurtCome = new long[10];
        Arrays.fill(yogurtCome, Long.MAX_VALUE);
        yogurtCome[0] = 0;

        int cur = yogurtNode[0];
        int curIdx = 0;
        for (int i = 1; i < 10; i++) {
            int next = yogurtNode[i];
            // ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๋‹ค์Œ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ์†Œ๊ฑฐ๋ฆฌ
            int minDist = dijkstra(cur)[next];

            // ์ด๋™ ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค๋ฉด ๊ทธ ๋‹ค์Œ ์ •์ ์œผ๋กœ
            if (minDist == INF) continue;

            // ์ด์ „ ๋ฐฉ๋ฌธ์‹œ๊ฐ„๊นŒ์ง€ ๊ฐ™์ด ๋ˆ„์ 
            yogurtCome[i] = minDist + yogurtCome[curIdx];

            cur = next;
            curIdx = i;
        }

        int myStart = Integer.parseInt(br.readLine()); // ๋‚ด๊ฐ€ ์ถœ๋ฐœํ•˜๋Š” ์ •์  ๋ฒˆํ˜ธ
        int[] myDist = dijkstra(myStart);

        int ans = INF;
        for (int i = 0; i < 10; i++) {
            cur = yogurtNode[i];
            // ์•„์คŒ๋งˆ๊ฐ€ i๋ฒˆ์งธ ์ง€์ ์œผ๋กœ ์˜ฌ ์ˆ˜ ์žˆ๊ณ ,
            // ๋‚ด๊ฐ€ ๋” ๋นจ๋ฆฌ ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ
            if (yogurtCome[i] != Long.MAX_VALUE && myDist[cur] <= yogurtCome[i]) {
                ans = Math.min(ans, cur);
            }
        }

        System.out.println(ans == INF ? -1 : ans);
    }

    private static int[] dijkstra(int cur) {
        int[] dist = new int[v+1];
        Arrays.fill(dist, INF);

        pq = new PriorityQueue<>();
        pq.offer(new Pos(cur, 0));
        dist[cur] = 0;

        while (!pq.isEmpty()) {
            Pos now = pq.poll();

            if (now.dist > dist[now.end]) continue;

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

        return dist;
    }
}

 

ํ•ด๊ฒฐ ์™„๋ฃŒ ! ๐Ÿ”ฅ

 

'Algorithm > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Boj_1497] ๊ธฐํƒ€์ฝ˜์„œํŠธ  (3) 2024.12.07
[Boj_1584] ๊ฒŒ์ž„  (0) 2024.11.29
[Boj_1464] ๋’ค์ง‘๊ธฐ 3  (0) 2024.07.19
[Boj_1238] ํŒŒํ‹ฐ  (2) 2024.03.21
[Boj_2252] ์ค„ ์„ธ์šฐ๊ธฐ  (1) 2024.01.11