카테고리 없음
[백준 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. 난이도 순으로 풀기 위해 힙을 이용하여 풀이