728x90
https://www.acmicpc.net/problem/14676
728x90
메모리: 73,964 KB , 시간: 568 ms
사용 알고리즘: 방향 비순환 그래프, 그래프 이론, 구현
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
// index가 건설 상태여야 건설할 수 있는 건물 리스트
ArrayList<ArrayList<Integer>> preList = new ArrayList<>();
for (int i = 0; i <= N; i++) {
preList.add(new ArrayList<>());
}
// 필요한 선행 건물 개수
int[] pre = new int[N + 1];
int X, Y;
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
X = Integer.parseInt(st.nextToken());
Y = Integer.parseInt(st.nextToken());
preList.get(X).add(Y);
pre[Y]++;
}
// 건물 개수
int[] num = new int[N + 1];
int c, a;
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
c = Integer.parseInt(st.nextToken());
a = Integer.parseInt(st.nextToken());
if(c == 1) {
// 선행 건물이 다 지어지지 않은 경우
if(pre[a] != 0) {
System.out.println("Lier!");
return;
}
// 건물이 하나도 없었던 경우
if(num[a] == 0) {
for (int j = 0; j < preList.get(a).size(); j++) {
pre[preList.get(a).get(j)]--;
}
}
num[a]++;
}
else {
// 건물이 없는 경우
if(num[a] == 0) {
System.out.println("Lier!");
return;
}
// 마지막 건물이었을 경우
if(num[a] == 1) {
for (int j = 0; j < preList.get(a).size(); j++) {
pre[preList.get(a).get(j)]++;
}
}
num[a]--;
}
}
System.out.println("King-God-Emperor");
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 2866] 문자열 잘라내기 (java) (1) | 2024.02.27 |
---|---|
[백준, BOJ 1595] 북쪽나라의 도로 (java) (1) | 2024.02.27 |
[백준, BOJ 2660] 회장뽑기 (java) (0) | 2024.02.25 |
[백준, BOJ 3673] 나눌 수 있는 부분 수열 (java) (1) | 2024.02.25 |
[백준, BOJ 18769] 그리드 네트워크 (java) (1) | 2024.02.25 |