티스토리 뷰

https://www.acmicpc.net/problem/14676

 

14676번: 영우는 사기꾼?

프로그램의 입력은 표준 입력으로 받는다. 입력의 첫 줄에는 건물 종류의 개수 N, 건물 사이 관계의 개수 M, 영우의 게임 정보의 개수 K가 주어진다.(1 ≤ N, M, K ≤ 100,000) 다음 줄부터 M줄에 걸쳐

www.acmicpc.net

위상정렬 알고리즘을 응용해서 풀이했습니다.


C++ 소스 코드

#include <iostream>
#include <vector>
#define MAX 100001
using namespace std;
int n,m,k;
vector<int> adj[MAX];
int inDegree[MAX], construct[MAX];
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n >> m >> k;
    int u,v;
    for(int i=0;i<m;i++){
        cin >> u >> v;
        adj[u].push_back(v);
        inDegree[v]++;
    }
    int op,a;
    bool pass = true;
    for(int i=0;i<k;i++){
        cin >> op >> a;
        if (op == 1){ // 만들기
            if(inDegree[a]==0) { // 만들 수 있음
                construct[a]++;
                if(construct[a]==1){ // 처음 만든 정점일때
                    for(int t = 0; t< adj[a].size();t++){
                        inDegree[adj[a][t]]--;
                    }
                }
            }else {
                pass= false;
            }
        }else { //삭제하기
            if(construct[a] > 0){ //삭제할 수 있음
                construct[a]--;
                if(construct[a]==0){ // 모든 a를 삭제했을 때
                    for(int t = 0; t< adj[a].size();t++){
                        inDegree[adj[a][t]]++;
                    }
                }
            }else {
                pass= false;
            }
        }
    }
    if(pass){
        cout << "King-God-Emperor" <<'\n';
    }else{
        cout << "Lier!" << '\n';
    }
    return 0;
}

'Algorithm > 알고리즘 문제풀이' 카테고리의 다른 글

BOJ) 4485 - 녹색 옷 입은 애가 젤다지?  (0) 2020.12.16
BOJ) 1065 - 한수  (0) 2020.12.02
BOJ) 1325 - 효율적인 해킹  (0) 2020.11.23
BOJ) 11728 - 배열 합치기  (0) 2020.11.15
BOJ) 1766 - 문제집  (0) 2020.11.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함