[문제]
[코드]
N 명의 학생들을 M번 비교하고 그 결과가 입력으로 주어진다.
이를 통해 학생들을 줄을 세우는 결과를 출력하면 된다.
학생들의 키가 모두 주어진 것이 아니고 일부만 주어졌으므로 '위상 정렬'을 사용해서 풀었다.
Degree에 각 노드에 대한 연결 차수를 저장하고
연결 차수가 0인 노드만 queue에 push 하여 순서대로 출력했다.
[풀이]
시간 : 44ms
#include <iostream>
#include <queue>
#include <vector>
#define MAX 32001
using namespace std;
int N,M;
int Degree[MAX]={0,};
vector <int> v[MAX];
int main(void)
{
queue <int> q;
scanf("%d %d",&N,&M);
for(int i=0;i<M;i++)
{
int x1,x2;
scanf("%d %d",&x1,&x2);
Degree[x2]++;
v[x1].push_back(x2);
}
for(int i=1;i<=N;i++) if(Degree[i]==0) q.push(i);
while(!q.empty())
{
int x = q.front();
q.pop();
printf("%d ",x);
for(int i=0;i<v[x].size();i++){
int tmp = v[x][i];
Degree[tmp]--;
if(Degree[tmp]==0) q.push(tmp);
}
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 3020. 개똥벌레 (0) | 2020.10.15 |
---|---|
[백준] 11660. 구간 합 구하기5 (0) | 2020.10.15 |
[백준]1463. 1로 만들기 (0) | 2020.10.09 |
[백준] 2003. 수들의 합 (0) | 2020.10.07 |
[백준] 17837. 새로운 게임2 (0) | 2020.10.06 |