728x90
https://www.acmicpc.net/problem/2252
2252번: 줄 세우기
첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의
www.acmicpc.net
순서가 정해져있는 작업을 처리하는 것이다.
게다가
여기서 킬포는 페이지 '출력' 부분에
"답이 여러 가지인 경우에는 아무거나 출력한다."
오케 이거는 위상정렬만 쓰면 되겠다.
위상정렬을 사용해 출력만 해주면 되는 문제였다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void line(vector<vector<int>> stdt, vector<int> node,int N) {
queue<int> q;
vector<bool> visit(N + 1,false);
for (int i = 1; i <= N; i++) {
if (!node[i])
q.push(i);
}
while (!q.empty()) {
int x = q.front();
q.pop();
cout << x << " ";
if (visit[x])
continue;
visit[x] = true;
for (int i = 0; i < stdt[x].size(); i++) {
int next = stdt[x][i];
node[next]--;
if (!node[next]) {
q.push(next);
}
}
}
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
vector<vector<int>> stdt(N+1);
vector<int> node(N + 1,0);
int a, b;
for (int i = 0; i < M; i++) {
cin >> a >> b;
stdt[a].push_back(b);
node[b]++;
}
line(stdt, node, N);
}
728x90
'문제 > 백준' 카테고리의 다른 글
c++ 백준_23562_"ㄷ 만들기" (0) | 2023.06.16 |
---|---|
c++ 백준_1753_"최단경로" (0) | 2023.06.16 |
c++ 백준_1600_"말이 되고픈 원숭이" (0) | 2023.06.15 |
c++ 백준_1405_"미친 로봇" (0) | 2023.06.15 |
c++ 백준_1715_"카드 정렬하기" (0) | 2023.06.15 |