ACM CRAFT와 비슷한 문제다.
1. in-degree가 0인거 부터
2. 문제 번호가 낮은거 우선순위
문제 번호가 낮은거 우선순위는 priority_queue로 하면되고,
in-degree는 위상정렬
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
#include <queue> | |
#include <vector> | |
/** | |
* https://www.acmicpc.net/problem/1766 | |
* BOJ 백준온라인져지 1766 문제집 풀이 | |
*/ | |
using namespace std; | |
int main () { | |
int numberOfVector; | |
int numberOfEdge; | |
scanf("%d%d", &numberOfVector, &numberOfEdge); | |
numberOfVector++; | |
numberOfEdge++; | |
int *indegree = new int[numberOfVector]; | |
vector<vector<int> > edges; | |
edges.resize(numberOfVector); | |
for (int i = 1; i < numberOfVector; i++) { | |
indegree[i] = 0; | |
} | |
for (int i = 1; i < numberOfEdge; i++) { | |
int firstSolve; | |
int lastSolve; | |
scanf("%d%d", &firstSolve, &lastSolve); | |
edges[firstSolve].push_back(lastSolve); | |
indegree[lastSolve]++; | |
} | |
priority_queue<int, vector<int>, greater<int> > queue; | |
for (int i = 1; i < numberOfVector; i++) { | |
if (indegree[i] == 0) queue.push(i); | |
} | |
while (queue.size()) { | |
int here = queue.top(); | |
queue.pop(); | |
printf("%d\n", here); | |
for (int i = 0, size = edges[here].size(); i < size; i++) { | |
int there = edges[here][i]; | |
indegree[there]--; | |
if (indegree[there] == 0) queue.push(there); | |
} | |
} | |
} |
'IT > 알고리즘' 카테고리의 다른 글
BOJ 백준온라인져지 2623 음악프로그램 풀이 (0) | 2017.12.23 |
---|---|
애니팡같은 게임 (0) | 2017.12.21 |
BOJ 백준온라인져지 1005 ACM Craft 풀이 (0) | 2017.12.19 |
BOJ 백준온라인져지 14926 Not Equal 풀이 (0) | 2017.12.17 |
BOJ 백준온라인져지 14925 목장 건설하기 풀이 (0) | 2017.12.16 |