알고리즘/백준

BOJ_2252 / C++

내이름은 킹햄찌 2022. 1. 3. 21:12

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

백준 온라인저지 2252번 문제입니다. 

위상정렬을 이용해서 풀었습니다.

#include<iostream>
#include<queue>
#include<vector>

using namespace std;

int N, M;
int num[32001];
vector<int> v[32001];

void Input() {
	int a, b;
	cin >> N >> M;
	for (int i = 0; i < M; i++) {
		cin >> a >> b;
		v[a].push_back(b);
		num[b]++;
	}
}

void solution() {
	queue<int> current;
	for (int i = 1; i <= N; i++)
		if (num[i] == 0) current.push(i);

	while (!current.empty()) {
		int i = current.front(); current.pop();
		cout << i << " ";

		for (int j = 0; j < v[i].size(); j++)
			if (--num[v[i][j]] == 0)
				current.push(v[i][j]);
	}
}

int main(void) {
	Input();
	solution();
}

아이디어

위상정렬 기본 개념이용