티스토리 뷰

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

Queue를 이용한 위상정렬 알고리즘으로 풀이하였습니다.


C++ 소스 코드

#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int n,m;
int inDegree[32002];
int res[32002];
vector<int> a[32001];
int main(){
    scanf("%d %d", &n, &m);
    for(int i=0;i<m;i++){
        int u,v;
        scanf("%d %d", &u ,&v);
        a[u].push_back(v);
        inDegree[v]++;
    }
    queue<int> q;
    for(int i=1;i<=n;i++){
        if(inDegree[i]==0) q.push(i);
    }
    for(int i=0;i<n;i++){
        int now = q.front();
        q.pop();
        res[i]=now;
        for(int j=0;j<a[now].size();j++){
            if(--inDegree[a[now][j]]==0) q.push(a[now][j]);
        }
    }
    for(int i=0;i<n;i++){
        printf("%d ", res[i]);
    }
    return 0;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
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
글 보관함