1. 문제 이해
영선이 & 영우 우주전쟁 : 각 플레이어는 건물을 건설하고 건물에서 유닛을 생성하여 싸우는 게임.
'우주전쟁'은 건물을 짓는 순서가 정해져있음.
2,3 건물은 1번 건물이 건설된 상태여야 지어질 수 있음
단, 4번 건물은 1번과는 직접적인 연관 없어서 1번 건물 없어도 4번 건물 건설 가능하다.
영우가 영선이한테 다 이김.
영선이가 이상하게 생각함.
영우의 건물 건설/파괴 정보를 가져와 치트키를 사용했는지 판단하는 프로그램 만들어 영선이 돕자.
- 입력
건물 종류 개수 N, 건물 사이 관계의 개수 M, 영우의 게임 정보 개수 K
M줄에 걸쳐 건물 관계 X Y가 중복없이 주어짐(X 건설해야 Y 건설 가능)
K줄에 걸쳐 영우의 게임 정보 다음과 같이 주어짐.
- 1 a (영우가 a번 건물을 1개 건설함)
- 2 a (영우가 a번 건물을 1개 파괴됨)
- 출력
영우 정상적으로 건물 건설 or 건설한 만큼만 파괴됐으면 'King-God Emperor' 출력
건설할 수 없는 건물 건설 or 건설한 적 없는 건물이 파괴됐으면 'Lier!' 출력
2. 조건
- 모든 건물들은 중복 건설이 가능
- 한 건물은 최대 3개의 건물에게만 영향을 미치도록 함.
- 치트키(원하는 건물을 마음대로 설치)가 있음
3. 풀이
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
#define MAX 100001
int n, m, k, x, y, num, node;
vector<int> edge[MAX];
int in_degree[MAX]; //기존
int woo[MAX]; //영우
int main() {
cin >> n >> m >> k;
while (m--) {
cin >> x >> y;
edge[x].push_back(y);
in_degree[y]++;
}
bool isTrue = true;
while (k--) {
cin >> num >> node;
if (num == 1) { //생성
if (in_degree[node] == 0) {
woo[node]++;
if (woo[node] == 1) { //처음 만든 정점일 때
for (auto next: edge[node]) {
in_degree[next]--;
}
}
} else {
isTrue = false;
}
} else { //파괴
if (woo[node] > 0) {
woo[node]--;
if (woo[node] == 0) { // 여기부분 어ㅠ
for (auto next: edge[node]) {
in_degree[next]++;
}
}
} else { // 치트키 써서 세운 건물을 파괴하려함
isTrue = false;
}
}
}
if (isTrue) {
cout << "King-God-Emperor";
} else {
cout << "Lier!";
}
return 0;
}
'⚖️Algorithm' 카테고리의 다른 글
[백준 14938] 서강그라운드 (0) | 2022.08.15 |
---|---|
[백준 2406] 안정적인 네트워크 (0) | 2022.08.03 |
[백준 3020] 개똥벌레 (0) | 2022.07.26 |
[백준 1766] 문제집 (0) | 2022.07.26 |
[백준 5021] 왕위 계승 (0) | 2022.07.18 |