๐ [๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ ํ์ด] Q.1005 ACM Craft ๋ฌธ์ ํ์ด
๐ ๋ฌธ์
https://www.acmicpc.net/problem/1005
์๊ธฐ 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ํฌ๋ํํธ ๋ํ์ ์ฐธ๊ฐํ๋ค! ์ต๋ฐฑ์ค์ ํ๋ คํ ์ปจํธ๋กค ์ค๋ ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒฝ๊ธฐ์์
ํน์ ๊ฑด๋ฌผ๋ง ์ง๋๋ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒ์์์ ์ด๊ธธ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋งค ๊ฒ์๋ง๋ค ํน์ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํ ์์๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ์ต๋ฐฑ์ค์ ์ข์ ํ๊ณ ์์๋ค. ๋ฐฑ์ค์ด๋ฅผ ์ํด ํน์ ๊ฑด๋ฌผ์
๊ฐ์ฅ ๋นจ๋ฆฌ ์ง์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์์๊ฐ์ ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ฃผ์.
๐ ์ ๊ทผ๋ฒ
boj Q.1005 ACM Craft ๋ฌธ์ ์ ๋๋ค.
๋ฌธ์ ์ ๊ฐ์ด ๊ฑด์ค ์์ ๊ท์น์ด ์ฃผ์ด์ง๋๋ค. ์ฃผ์ด์ง ๊ฑด์ค ์์ ๊ท์น๋๋ก
๋ฐ๋์ ์ด๋ค ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด ์ ํ ๋์ด์ผํ๋ ๊ฑด๋ฌผ๋ค์ด ์๋ค๋ฉด ๊ทธ ์ ํ ๋์ด์ผํ๋ ๊ฑด๋ฌผ๋ค์ด ๋ชจ๋ ์ง์ด์ ธ์ผ๋ง
๊ฑด์ค์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ฑด์ค ์์ ๊ท์น์ด ๊ทธ๋ํ๋ก ์ฃผ์ด์ง๊ณ ์ ํ ํํ ๊ด๊ณ๊ฐ ์ฃผ์ด์ง๋ฉฐ ๊ทธ ๊ด๊ณ๊ฐ ๋ฐ๋์ ์ง์ผ์ ธ์ผ ํ๋ฏ๋ก
์์์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ํ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋จ, ์ด ๋ฌธ์ ๋ ์ ํ ํํ ๊ด๊ณ๋ ์ค์ํ์ง๋ง ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํ ์ด ์์์๊ฐ์ ๊ตฌํด์ผํ๋ฏ๋ก
์์์๊ฐ๋ ์ค์ํฉ๋๋ค.
๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํ ์ ํ ๊ฑด๋ฌผ๋ค์ด ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ ๋ชจ๋ ์ง์ด์ ธ์ผ๋ง ๊ฐ๋ฅํ๋ฏ๋ก
์ ํ ๊ฑด๋ฌผ๋ค ์ค ๊ฐ์ฅ ์ค๋ ์์๋๋ ์๊ฐ์ด ์ง๋์ผ๋ง ๊ฑด๋ฌผ์ ์ง๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์๋ก์ด ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด ํ์ํ ์ ํ ๊ฑด๋ฌผ๋ค ์ค ๊ฐ์ฅ ์ค๋ ์์๋๋ ์๊ฐ์ ๋ํด์ค์ผ ํฉ๋๋ค.
dp[next] = Math.max(dp[next],dp[current]+time[next]);
๊ทธ๋ฆฌ๊ณ ๋ฐฑ์ค์ด๊ฐ ์น๋ฆฌํ๊ธฐ ์ํด ๊ฑด์คํด์ผ ํ ๊ฑด๋ฌผ์ ๋ฒํธ๊ฐ ์ ํด์ ธ์๋ ๊ฒ์ด ์๋๋ผ
์์์ ๋ฒํธ W์ด๋ฏ๋ก ๋์ ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํ์ฌ ํ์ดํ์์ต๋๋ค.
๐ป ์ฝ๋
package problem.topological_sort;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Main_1005 {
static int t,n,k,w;
static int time[];
static List<List<Integer>> adjList;
static int depth[];
static int dp[];
static Queue<Integer> queue;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
input();
System.out.println(sb.toString());
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
t= Integer.parseInt(br.readLine());
for(int i=0 ;i<t; i++){
adjList = new ArrayList<>();
String[] temp = br.readLine().split(" ");
n = Integer.parseInt(temp[0]);
k = Integer.parseInt(temp[1]);
time = new int[n+1];
depth = new int[n+1];
dp = new int[n+1];
temp = br.readLine().split(" ");
for (int j=0; j<=n; j++){
adjList.add(new ArrayList<>());
}
for(int j=1; j<=n; j++){
time[j] = Integer.parseInt(temp[j-1]);
dp[j] = time[j];
}
for(int j=1; j<=k; j++){
temp = br.readLine().split( " ");
int u = Integer.parseInt(temp[0]);
int v = Integer.parseInt(temp[1]);
adjList.get(u).add(v);
depth[v]++;
}
w = Integer.parseInt(br.readLine());
solve();
}
br.close();
}
private static void solve(){
queue = new LinkedList<>();
for(int i=1; i<=n; i++){
if(depth[i] == 0){
queue.offer(i);
}
}
while (! queue.isEmpty()){
int current = queue.poll();
if(current == w) {
sb.append(dp[w]+"\n");
return;
}
for(int next : adjList.get(current)){
depth[next]--;
if(depth[next] == 0){
queue.offer(next);
}
dp[next] = Math.max(dp[next],dp[current]+time[next]);
}
}
}
}