문제
https://www.acmicpc.net/problem/14567
설명
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
//14567
vector<int> a[1001];
int degree[1001];
int result[1001];
queue<int> q;
int main()
{
int N,M;
cin >> N >> M;
for(int i = 0;i<M;i++)
{
int A,B;
cin >> A >> B;
a[A].push_back(B);
degree[B]++;
}
for(int i = 1; i<= N; i++)
{
if(degree[i] == 0)
q.push(i);
result[i] = 1;
}
while(!q.empty())
{
int x = q.front();
q.pop();
for(int i = 0;i<a[x].size();i++)
{
int next = a[x][i];
--degree[next];
if(degree[next] == 0)
{
q.push(next);
result[next] = max(result[x]+1, result[next]);
}
}
}
for(int i = 1; i<=N; i++)
{
cout<<result[i]<< " ";
}
}
위상정렬 문제이다. 이 문제를 통해서 위상정렬에 대해 처음 공부해 보았다.
위상정렬에서는 사이클이 발생하면 안되고, 시작점이 존재해야 한다.
1. 진입차수가 0인 정점들을 큐에 삽입한다.
2. 큐에서 원소를 꺼내면서 연결된 간선들을 제거한다.
3. 간선 제거 이후에 진입차수가 0인 정점들은 큐에 삽입한다.
4. 큐가 빌때까지 2~3과정을 반복한다.
반응형
'알고리즘 문제 > C++' 카테고리의 다른 글
[백준] 23288번: 주사위 굴리기 2 - C++ (0) | 2022.10.06 |
---|---|
[백준] 20057번: 마법사 상어와 토네이도 - C++ (1) | 2022.09.21 |
[백준] 23061번 : 백남이의 여행 준비 - C++ (0) | 2022.04.26 |
[백준] 23057번 : 도전 숫자왕 - C++ (0) | 2022.04.26 |
[백준] 1181번: 단어정렬 - C++ (0) | 2022.03.31 |