<aside> ๐ 1005 ACM Craft
๋ฌธ์
์๊ธฐ 2012๋ ! ๋๋์ด 2๋ ๊ฐ ์๋ง์ ๊ตญ๋ฏผ๋ค์ ๊ธฐ๋ค๋ฆฌ๊ฒย ํ ๊ฒ์ ACM Craft (Association of Construction Manager Craft)๊ฐ ๋ฐ๋งค๋์๋ค.
์ด ๊ฒ์์ ์ง๊ธ๊น์ง ๋์จ ๊ฒ์๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ACMํฌ๋ํํธ๋ ๋ค์ด๋๋ฏนํ ๊ฒ์ ์งํ์ ์ํด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ ํด์ ธ ์์ง ์๋ค. ์ฆ, ์ฒซ ๋ฒ์งธ ๊ฒ์๊ณผ ๋ ๋ฒ์งธ ๊ฒ์์ด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ๋ค๋ฅผ ์๋ ์๋ค. ๋งค ๊ฒ์์์ ์ ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ฃผ์ด์ง๋ค. ๋ํ ๋ชจ๋ ๊ฑด๋ฌผ์ ๊ฐ๊ฐ ๊ฑด์ค์ ์์ํ์ฌ ์์ฑ์ด ๋ ๋๊น์ง Delay๊ฐ ์กด์ฌํ๋ค.
์์ ์์๋ฅผ ๋ณด์.
์ด๋ฒ ๊ฒ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฑด์ค ์์ ๊ท์น์ด ์ฃผ์ด์ก๋ค.ย 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
์ด๋ฅผ ๊ทธ๋ํ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ ์์์์ 7๋ฒ์ ๊ฑด์คํ๊ธฐ ์ํด์๋ 5, 6๋ฒ์ด ๋จผ์ ๊ฑด์ค๋์ด์ผ ํ๋ค. ๊ทธ๋ฌ๋๊น ์ฒ์๋ถํฐ 7๋ฒ ๊ฑด์ค๊น์ง ๊ฑธ๋ฆฌ๋ ์ด ์๊ฐ์
1, 2๋ฒ ๋ ์ค ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ ๋ ๊ฒ์ด๋ค.