Skip to content

Commit 9f61e4f

Browse files
authored
Create 11 BOJ G3 ACM Craft.md
1 parent 59e4adc commit 9f61e4f

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
```java
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class Main {
6+
private static List<List<Integer>> graph;
7+
private static int[] indegree, buildTime, minTime;
8+
private static int N, W;
9+
10+
public static void main(String[] args) throws IOException {
11+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
12+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
13+
14+
int T = Integer.parseInt(br.readLine());
15+
16+
for (int t = 0; t < T; t++) {
17+
StringTokenizer st = new StringTokenizer(br.readLine());
18+
N = Integer.parseInt(st.nextToken());
19+
int K = Integer.parseInt(st.nextToken());
20+
21+
buildTime = new int[N + 1];
22+
st = new StringTokenizer(br.readLine());
23+
for (int i = 1; i <= N; i++) {
24+
buildTime[i] = Integer.parseInt(st.nextToken());
25+
}
26+
27+
graph = new ArrayList<>();
28+
for (int i = 0; i <= N; i++) {
29+
graph.add(new ArrayList<>());
30+
}
31+
32+
indegree = new int[N + 1];
33+
34+
for (int i = 0; i < K; i++) {
35+
st = new StringTokenizer(br.readLine());
36+
int X = Integer.parseInt(st.nextToken());
37+
int Y = Integer.parseInt(st.nextToken());
38+
39+
graph.get(X).add(Y);
40+
indegree[Y]++;
41+
}
42+
43+
W = Integer.parseInt(br.readLine());
44+
45+
topologicalSort();
46+
bw.write(minTime[W] + "\n");
47+
}
48+
49+
bw.flush();
50+
bw.close();
51+
br.close();
52+
}
53+
54+
private static void topologicalSort() {
55+
Queue<Integer> queue = new LinkedList<>();
56+
minTime = new int[N + 1];
57+
58+
for (int i = 1; i <= N; i++) {
59+
if (indegree[i] == 0) {
60+
queue.offer(i);
61+
minTime[i] = buildTime[i];
62+
}
63+
}
64+
65+
while (!queue.isEmpty()) {
66+
int current = queue.poll();
67+
68+
for (int next : graph.get(current)) {
69+
minTime[next] = Math.max(minTime[next], minTime[current] + buildTime[next]);
70+
indegree[next]--;
71+
72+
if (indegree[next] == 0) {
73+
queue.offer(next);
74+
}
75+
}
76+
}
77+
}
78+
}
79+
```

0 commit comments

Comments
 (0)