상세 컨텐츠

본문 제목

2252번: 줄 세우기 - 위상 정렬

알고리즘/baekjoon

by oVeron 2023. 1. 20. 20:58

본문

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 <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

 

728x90
반응형

관련글 더보기

댓글 영역