티스토리 뷰

알고리즘/백준

백준 / 2252 줄 세우기 C++

4567은 소수 2021. 3. 4. 02:17

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

골드2 문제였는데 정답률이 50%가 넘길래 어디 기출문제나 유명한 문제인 줄 알았는데 그냥 쉬운 위상정렬 문제였다.

 

위상정렬을 간단히 말하면, 사이클이 없는 방향 그래프에서 각 노드의 순서를 위배하지 않으면서 노드를 정렬하는 것이다. 간단하게 아래에 설명을 했다.

ghqls0210.tistory.com/96 

 

백준 / 1516 게임 개발 C++

https://www.acmicpc.net/problem/1516 1516번: 게임 개발 첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는..

ghqls0210.tistory.com

 

해당 문제는 사이클을 따로 체크할 필요도 없고 뭐 특별한 제약 조건도 없기에 그냥 주어진 입력대로 위상정렬 시켜 출력하면 된다.

 

코드는 다음과 같다.

#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;

int n, m;
vector<int>student[32001]; // vector : i번 학생보다 큰 학생들
int degree[32001]; // 진입 차수

void make_student()
{
	cin >> n >> m;
	while (m--)
	{
		int a, b;
		cin >> a >> b;
		student[a].push_back(b);
		degree[b]++;
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	make_student();

	// 위상 정렬 시작
	queue<int>q;
	for (int i = 1; i <= n; i++)
		if (degree[i] == 0)
			q.push(i);

	while (!q.empty())
	{
		int num = q.front();
		q.pop();
		cout << num << ' ';
		for (int i = 0; i < student[num].size(); i++) {
			degree[student[num][i]]--;
			if (degree[student[num][i]] == 0)
				q.push(student[num][i]);
		}
	}
}

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 / 11559 Puyo Puyo C++  (0) 2021.03.07
백준 / 10422 괄호 C++  (1) 2021.03.05
백준 / 1916 최소비용 구하기 C++  (0) 2021.03.02
백준 / 1786 찾기 C++  (0) 2021.03.01
백준 / 5014 스타트링크 C++  (0) 2021.03.01
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함