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 <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
int N, M;
vector<int> graph[32001];
int enter[32001]; //해당 노드로 들어올 수 있는 정점 수
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
for (int i{ 1 }; i <= M; i++)
{
int A, B; cin >> A >> B;
graph[A].push_back(B);
enter[B]++;
}
queue<int> qu;
for (int i{ 1 }; i <= N; i++)
{
if (enter[i] == 0) qu.push(i);
//들어올 수 없는 정점을 qu에 저장
}
vector<int> line;
while (line.size() < N)
{
int u = qu.front(); qu.pop();
line.push_back(u);
for (int v : graph[u])
{
enter[v]--; //u에 연결된 간선을 제거
if (enter[v] == 0) qu.push(v);
//이때 v로 들어올 수 있는 정점이 없다면 v를 qu에 저장
}
}
for (int i : line) cout << i << " ";
}
참고 링크
https://anz1217.tistory.com/28
위상 정렬
위상 정렬(Topological sorting)은 유향 그래프의 정점들을 변의 방향을 거스르지 않도록 나열하는 것을 말합니다. 쉽게 말해서 간선 \(u \rightarrow v\)가 있다면, 정점 \(v\)는 무조건 정점 \(u\)이후에 등
anz1217.tistory.com
17472번: 다리 만들기 2 - 최소 스패닝 트리(MST) (0) | 2023.01.23 |
---|---|
2042번: 구간 합 구하기 - 세그먼트 트리(Segment Tree) (0) | 2023.01.21 |
1197번: 최소 스패닝 트리 - MST(prim) (0) | 2023.01.20 |
4195번: 친구 네트워크 - 유니온 파인드(Union-Find) (2) | 2023.01.20 |
1219번: 오민식의 고민 - 벨만-포드 (0) | 2023.01.20 |
댓글 영역