[Java] ๋ฐฑ์ค 1516๋ฒ - ๊ฒ์ ๊ฐ๋ฐ
https://www.acmicpc.net/problem/1516
----------------------------------------------------------------------------------------------------------------------
[๋ฌธ์ ํ์ด]
์ด ๋ฌธ์ ๋ ํน์์๊ณ ๋ฆฌ์ฆ์ธ ์์์ ๋ ฌ์ ์ฌ์ฉํด์ผ ํ๋ ๋ฌธ์ ์์ต๋๋ค.
( ์์์ ๋ ฌ์ ๋ชฐ๋ผ์ ํ์ฐธ ํค๋งค๋ค๊ฐ ๊ฒฐ๊ตญ ํ์ด๋ฅผ ์ฐธ๊ณ ํด์ ํ์๋ค์ใ ใ )
์๋์ ๋ธ๋ก๊ทธ๊ฐ ์์์ ๋ ฌ์ ์ดํดํ๋๋ฐ ๋ง์ ๋์์ด ๋์์ต๋๋ค.
https://codingnojam.tistory.com/66
์์ 1๋ฒ์ ์ดํด๋ณด๋ฉด ์ปดํจํฐ์ ์ง์ ์ฐจ์์ธ degree[]๋ฐฐ์ด์ ์๋์ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ์ง์ ์ฐจ์๊ฐ 0์ธ 1์ ์ฐ์ ์์ํ์ ๋ฃ์ด์ฃผ๊ณ ๋ ธ๋๋ค์ ์์กด๊ด๊ณ๋ฅผ child ArrayList์ ์ ์ฅํ์ฌ ์์์ ๋ ฌ์ ์งํํฉ๋๋ค.
์ด๋, ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ์์์ ๋ ฌ๊ณผ ๋ค๋ฅด๊ฒ ๊ฒ์ ๊ฐ๋ฐ ๋ฌธ์ ์์๋ ๋ชจ๋ ๊ฑด๋ฌผ์ ์ง๋๋ฐ ์ต์์๊ฐ์ ๊ตฌํด์ผํ๊ธฐ ๋๋ฌธ์ ๊ฑด๋ฌผ์ ์ง๋๋ฐ ๋๋ ์๊ฐ์ ์ ์ฅํ ๋ฐฐ์ด time[]๊ณผ ํด๋น ๋ ธ๋๊น์ง ์ค๊ธฐ์ํด ๋ฐฉ๋ฌธํ๋ ๋ ธ๋๋ค์ ์ต๋๊ฐ์ ์ ์ฅํด๋๋ maxTime[]์ ์ถ๊ฐํ์์ต๋๋ค.
[์ ๋ต ์ฝ๋]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
public static int N;
public static int time[];
public static ArrayList<ArrayList<Integer>> child = new ArrayList<ArrayList<Integer>>();
public static int maxTime[];
public static int degree[];
public static PriorityQueue<Integer> pq = new PriorityQueue<>();
public static ArrayList<Integer> start = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
time = new int[N + 1];
maxTime = new int[N + 1];
degree = new int[N + 1];
for(int i=0;i<=N;i++) {
child.add(new ArrayList<Integer>());
}
for(int i=1;i<=N;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
time[i] = Integer.parseInt(st.nextToken());
int num = Integer.parseInt(st.nextToken());
int cnt = 0;
if(num == -1) {
pq.offer(i);
} else {
while(num != -1) {
cnt++;
child.get(num).add(i);
num = Integer.parseInt(st.nextToken());
}
degree[i] = cnt;
}
}
findChild();
for(int i=1;i<=N;i++) {
System.out.println(time[i]);
}
}
public static void findChild() {
while(!pq.isEmpty()) {
int p = pq.poll();
for(Integer i:child.get(p)) {
degree[i]--;
maxTime[i] = Math.max(maxTime[i], time[p]);
if(degree[i] == 0) {
time[i] += Math.max(maxTime[i], time[p]);
pq.offer(i);
}
}
}
}
}