아무코딩

[백준 2252] 줄세우기 본문

알고리즘/백준

[백준 2252] 줄세우기

동 코 2020. 5. 8. 20:04

문제풀이

위상정렬 공부후 적용을 위해 푼 문제이다.

 

자료구조에서 위상정렬을 배울 때는 연결리스트를 만들어 사용하였지만. 벡터를 알고있으니 이차원 벡터를 사용한다.

 

graph[from].push(to);

 

input이 들어올때마다 저렇게 추가해준다. 그리고 to기준으로 indegree를 추가할때마다 1씩 증가시켜준다.

 

indegree가 0인 것을 먼저 큐에 삽입한다.

 

하나씩 빼면서 출력하고 from이 가리키는 to의 indegree를 줄이고 연결도 지워나간다. (-> 위상정렬에서 삭제하는 과정)

계속 반복한다. 언제까지? 큐가 빌때까지

소스코드

더보기
w
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <vector>
#include <queue>
 
using namespace std;
 
int N, M;
 
queue<int> q;
vector<vector<int>> graph;
vector<int> cnt_indegree;
int main() {
    
    scanf("%d %d",&N,&M);
    
    graph.assign(N+1vector<int>(0,0));
    cnt_indegree.assign(N+10);
    for(int i=0;i<M;i++){
        int from,to;
        scanf("%d %d",&from,&to);
        graph[from].push_back(to);
        cnt_indegree[to]++;
    }
    
    for(int i=1;i<=N;i++){
        if(cnt_indegree[i]==0)
            q.push(i);
    }
    
    while(!q.empty()){
        int node = q.front();
        q.pop();
        printf("%d ",node);
        for(int i=0;i<graph[node].size();i++){
            cnt_indegree[graph[node][i]]--;
            if(cnt_indegree[graph[node][i]]==0){
                q.push(graph[node][i]);
            }
        }
        graph[node].clear();
    }
    
    return 0;
}
 
cs

문제 링크 : https://www.acmicpc.net/problem/2252

 

2252번: 줄 세우기

첫째 줄에 N(1≤N≤32,000), M(1≤M≤100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이다. 학생들의 번호는 1번부터 N번이다.

www.acmicpc.net

 

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

[백준 2580] 스도쿠  (0) 2020.05.11
[백준 1300] k번째수  (0) 2020.05.08
[백준 14499] 주사위 굴리기  (0) 2020.05.06
[백준 14888] 연산자 끼워넣기  (0) 2020.04.28
[백준 2573] 빙산  (0) 2020.04.27
Comments