카테고리 없음

[백준 1766] 문제집

홍시홍 2020. 2. 15. 14:03

 

#include <stdio.h>
#include <map>
#include <algorithm>
//#include "Windows.h"
#include <iostream>
#include <queue>
#include <functional>
#include <vector>

using namespace std;
 
priority_queue<int,vector<int>,greater<>> q;

int n,m;
int visit[32010];
vector<int> v[32010];
int main(){
    cin>>n>>m;
    for(int i=0 ; i < m ; i++){
        int x,y;
        scanf("%d%d",&x,&y);
        visit[y]++;
        v[x].push_back(y);
    }
    for(int i=1;i<=n; i++){
        if(visit[i]==0){
            q.push(i);
        }
    }
    vector<int> ans;
    while(!q.empty()){
        int now= q.top();
        ans.push_back(now);
        q.pop();
        for(int i=0 ; i<v[now].size(); i++){
            int node= v[now][i];
            if(visit[node]>0){
                visit[node]--;
                if(visit[node]==0){
                    q.push(node);
                }
            }
        }
    }
    for(int i=0 ; i <ans.size();i++){
        printf("%d ",ans[i]);
    }
}

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

 

1766번: 문제집

첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주어진다. 이는 A번 문제는 B번 문제보다 먼저 푸는 것이 좋다는 의미이다. 항상 문제를 모두 풀 수 있는 경우만 입력으로 주어진다.

www.acmicpc.net

요구사항

조건대로 문제 푸는 순서를 구하라

 

풀이

1. 위상 정렬로 먼저 풀어야하는 문제를 연결시켜주고, 먼저 풀어야된다면 visit를 ++

2. 난이도 순으로 풀기 위해 힙을 이용하여 풀이