<aside> ๐Ÿ“Œ 1005 ACM Craft

๋ฌธ์ œ

์„œ๊ธฐ 2012๋…„! ๋“œ๋””์–ด 2๋…„๊ฐ„ ์ˆ˜๋งŽ์€ ๊ตญ๋ฏผ๋“ค์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒย ํ•œ ๊ฒŒ์ž„ ACM Craft (Association of Construction Manager Craft)๊ฐ€ ๋ฐœ๋งค๋˜์—ˆ๋‹ค.

์ด ๊ฒŒ์ž„์€ ์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์˜จ ๊ฒŒ์ž„๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ACMํฌ๋ž˜ํ”„ํŠธ๋Š” ๋‹ค์ด๋‚˜๋ฏนํ•œ ๊ฒŒ์ž„ ์ง„ํ–‰์„ ์œ„ํ•ด ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๋‹ค. ์ฆ‰, ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์ž„๊ณผ ๋‘ ๋ฒˆ์งธ ๊ฒŒ์ž„์ด ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ๋งค ๊ฒŒ์ž„์‹œ์ž‘ ์‹œ ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๊ฑด๋ฌผ์€ ๊ฐ๊ฐ ๊ฑด์„ค์„ ์‹œ์ž‘ํ•˜์—ฌ ์™„์„ฑ์ด ๋  ๋•Œ๊นŒ์ง€ Delay๊ฐ€ ์กด์žฌํ•œ๋‹ค.

Untitled

์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

์ด๋ฒˆ ๊ฒŒ์ž„์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฑด์„ค ์ˆœ์„œ ๊ทœ์น™์ด ์ฃผ์–ด์กŒ๋‹ค.ย 1๋ฒˆ ๊ฑด๋ฌผ์˜ ๊ฑด์„ค์ด ์™„๋ฃŒ๋œ๋‹ค๋ฉด 2๋ฒˆ๊ณผ 3๋ฒˆ์˜ ๊ฑด์„ค์„ ์‹œ์ž‘ํ• ์ˆ˜ ์žˆ๋‹ค. (๋™์‹œ์— ์ง„ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค)ย ๊ทธ๋ฆฌ๊ณ  4๋ฒˆ ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๋ฒˆ๊ณผ 3๋ฒˆ ๊ฑด๋ฌผ์ด ๋ชจ๋‘ ๊ฑด์„ค ์™„๋ฃŒ๋˜์–ด์•ผ์ง€๋งŒ 4๋ฒˆ๊ฑด๋ฌผ์˜ ๊ฑด์„ค์„ ์‹œ์ž‘ํ• ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ 4๋ฒˆ๊ฑด๋ฌผ์˜ ๊ฑด์„ค์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ์ฒ˜์Œ 1๋ฒˆ ๊ฑด๋ฌผ์„ ๊ฑด์„คํ•˜๋Š”๋ฐ 10์ดˆ๊ฐ€ ์†Œ์š”๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  2๋ฒˆ ๊ฑด๋ฌผ๊ณผ 3๋ฒˆ ๊ฑด๋ฌผ์„ ๋™์‹œ์— ๊ฑด์„คํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด 2๋ฒˆ์€ 1์ดˆ๋’ค์— ๊ฑด์„ค์ด ์™„๋ฃŒ๋˜์ง€๋งŒ ์•„์ง 3๋ฒˆ ๊ฑด๋ฌผ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ 4๋ฒˆ ๊ฑด๋ฌผ์„ ๊ฑด์„คํ•  ์ˆ˜ ์—†๋‹ค. 3๋ฒˆ ๊ฑด๋ฌผ์ด ์™„์„ฑ๋˜๊ณ  ๋‚˜๋ฉด ๊ทธ๋•Œ 4๋ฒˆ ๊ฑด๋ฌผ์„ ์ง€์„์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 4๋ฒˆ ๊ฑด๋ฌผ์ด ์™„์„ฑ๋˜๊ธฐ๊นŒ์ง€๋Š” ์ด 120์ดˆ๊ฐ€ ์†Œ์š”๋œ๋‹ค.

ํ”„๋กœ๊ฒŒ์ด๋จธ ์ตœ๋ฐฑ์ค€์€ ์• ์ธ๊ณผ์˜ ๋ฐ์ดํŠธ ๋น„์šฉ์„ ๋งˆ๋ จํ•˜๊ธฐ ์œ„ํ•ด ์„œ๊ฐ•๋Œ€ํ•™๊ต๋ฐฐ ACMํฌ๋ž˜ํ”„ํŠธ ๋Œ€ํšŒ์— ์ฐธ๊ฐ€ํ–ˆ๋‹ค! ์ตœ๋ฐฑ์ค€์€ ํ™”๋ คํ•œ ์ปจํŠธ๋กค ์‹ค๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒฝ๊ธฐ์—์„œ ํŠน์ • ๊ฑด๋ฌผ๋งŒ ์ง“๋Š”๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒŒ์ž„์—์„œ ์ด๊ธธ ์ˆ˜ ์žˆ๋‹ค.ย ๊ทธ๋Ÿฌ๋‚˜ ๋งค ๊ฒŒ์ž„๋งˆ๋‹ค ํŠน์ •๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•œ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์ตœ๋ฐฑ์ค€์€ ์ขŒ์ ˆํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.ย ๋ฐฑ์ค€์ด๋ฅผ ์œ„ํ•ด ํŠน์ •๊ฑด๋ฌผ์„ ๊ฐ€์žฅ ๋นจ๋ฆฌ ์ง€์„ ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ์‹œ๊ฐ„์„ ์•Œ์•„๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์ฃผ์ž.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค.ย ์ฒซ์งธ ์ค„์— ๊ฑด๋ฌผ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฑด๋ฌผ๊ฐ„์˜ ๊ฑด์„ค์ˆœ์„œ ๊ทœ์น™์˜ ์ด ๊ฐœ์ˆ˜ K์ด ์ฃผ์–ด์ง„๋‹ค.ย (๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ์กด์žฌํ•œ๋‹ค)

๋‘˜์งธ ์ค„์—๋Š” ๊ฐ ๊ฑด๋ฌผ๋‹น ๊ฑด์„ค์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ D1, D2, ..., DN์ด ๊ณต๋ฐฑ์„ ์‚ฌ์ด๋กœ ์ฃผ์–ด์ง„๋‹ค.ย ์…‹์งธ ์ค„๋ถ€ํ„ฐ K+2์ค„๊นŒ์ง€ ๊ฑด์„ค์ˆœ์„œ X Y๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.ย (์ด๋Š” ๊ฑด๋ฌผ X๋ฅผ ์ง€์€ ๋‹ค์Œ์— ๊ฑด๋ฌผ Y๋ฅผ ์ง“๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค)

๋งˆ์ง€๋ง‰ ์ค„์—๋Š” ๋ฐฑ์ค€์ด๊ฐ€ ์Šน๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฑด์„คํ•ด์•ผย ํ•  ๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ W๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

๊ฑด๋ฌผ W๋ฅผ ๊ฑด์„ค์™„๋ฃŒ ํ•˜๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค. ํŽธ์˜์ƒ ๊ฑด๋ฌผ์„ ์ง“๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๋ฐ๋Š” ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๊ฑด์„ค์ˆœ์„œ๋Š” ๋ชจ๋“  ๊ฑด๋ฌผ์ด ๊ฑด์„ค ๊ฐ€๋Šฅํ•˜๋„๋ก ์ฃผ์–ด์ง„๋‹ค.

</aside>

๋‚˜์˜ ๋‹ต์•ˆ

N: ์ •์  ๊ฐœ์ˆ˜ K: ๊ฐ„์„  ๊ฐœ์ˆ˜

Di: i๋ฒˆ์งธ ์ •์ ์—์„œ ๋‹ค๋ฅธ ์ •์ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„

X Y: X์—์„œ Y๋กœ ์ด๋™ํ•˜๋Š” ๊ฐ„์„  ์กด์žฌ

W: ๋„์ฐฉ ์ •์ 

ํ•˜ ์˜ค๋Š˜ ํ•˜๋ฃจ ์˜จ์ข…์ผ ์ด ๋ฌธ์ œ๋งŒ ๋ถ™์žก๊ณ  ์žˆ๋‹ค๊ฐ€ ๊ฒจ์šฐ ํ’€์—ˆ๋‹คโ€ฆ. ๋ฌธ์ œ ๋Œ€์ถฉ ์ฝ๊ณ  ๋‚ด ๋ง˜๋Œ€๋กœ ํ’€๋‹ค๊ฐ€ ๋ป˜์ง“๋งŒ ์—„์ฒญ ํ–ˆ๋‹ค. ๊ทธ๋ž˜ํ”„๋งŒ ๋‚˜์˜ค๋ฉด ์–ด๋–ป๊ฒŒ๋“  ๋‚ด๊ฐ€ ์•„๋Š” ๋ฐฉ์‹์œผ๋กœ(dfs, bfs, ๋‹ค์ต์ŠคํŠธ๋ผ ๋“ฑ๋“ฑโ€ฆ) ํ’€๋ ค๊ณ  ํ•˜๋‹ค ๋ณด๋‹ˆ๊นŒ ์ด๊ฒƒ๋„ ๊ดœํžˆ ์ด์ƒํ•˜๊ฒŒ ์ ‘๊ทผํ•ด์„œ ์‹œ๊ฐ„๋งŒ ๋‚ญ๋น„ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์กฐ๊ธˆ๋งŒ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋ง‰ ์–ด๋งˆ์–ด๋งˆํ•œ ์ ‘๊ทผ๋„ ์•„๋‹Œ๋ฐโ€ฆ.

import java.util.*;
import java.io.*;

class Main {
    static int[] D;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        
        for (int j = 0; j < T; j++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int K = Integer.parseInt(st.nextToken());
            
            D = new int[N + 1];
            List<Edge>[] reverseGraph = new List[N + 1];
            st = new StringTokenizer(br.readLine());
            for (int i = 1; i <= N; i++) {
                D[i] = Integer.parseInt(st.nextToken());
                reverseGraph[i] = new ArrayList<>();
            }

            for (int i = 0; i < K; i++) {
                String[] input = br.readLine().split(" ");
                reverseGraph[Integer.parseInt(input[1])].add(new Edge(Integer.parseInt(input[0]), D[Integer.parseInt(input[1])]));
            }

            int W = Integer.parseInt(br.readLine());
            long min = Long.MAX_VALUE;
            for (int i = 1; i <= N; i++) {
                if (reverseGraph[i].isEmpty()) {
                    long[] cache = new long[N + 1];
                    Arrays.fill(cache, -1);
                    min = Math.min(min, findMin(reverseGraph, new long[N + 1], W, i));
                }
            }
            sb.append(min).append("\\n");
        }
        System.out.println(sb.toString());
    }

    private static long findMin(List<Edge>[] graph, long[] cache, int curr, int start) {
        if (cache[curr] == -1) {
            if (curr == start) {
                cache[curr] = D[start];
            } else {
                if (graph[curr].size() == 0) {
                    cache[curr] = D[curr];
                } else {
                    long max = findMin(graph, cache, graph[curr].get(0).to, start);
                    for (int i = 1; i < graph[curr].size(); i++) {
                        max = Math.max(max, findMin(graph, cache, graph[curr].get(i).to, start));
                    }
                    cache[curr] = max + D[curr];
                }
            }   
        }
        return cache[curr];
    }

    static class Edge {
        int to;
        long weight;

        Edge(int to, long weight) {
            this.to = to;
            this.weight = weight;
        }
    }
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅ์ด ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•ด๋ณด์ž.

1
8 8
10 20 1 5 8 7 1 43
1 2
1 3
2 4
2 5
3 6
5 7
6 7
7 8
7

์ด๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Untitled

์œ„ ์˜ˆ์‹œ์—์„œ 7๋ฒˆ์„ ๊ฑด์„คํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 5, 6๋ฒˆ์ด ๋จผ์ € ๊ฑด์„ค๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ฒ˜์Œ๋ถ€ํ„ฐ 7๋ฒˆ ๊ฑด์„ค๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์ด ์‹œ๊ฐ„์€

  1. (์ฒ˜์Œ~5๋ฒˆ ๊ฑด์„ค๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„) + (7๋ฒˆ ๊ฑด์„ค์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„)
  2. (์ฒ˜์Œ~6๋ฒˆ ๊ฑด์„ค๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„) + (7๋ฒˆ ๊ฑด์„ค์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„)

1, 2๋ฒˆ ๋‘˜ ์ค‘ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ๋  ๊ฒƒ์ด๋‹ค.