알고리즘/BOJ 문제풀이

[Graph] BOJ 1766 문제집

4Legs 2020. 12. 21. 19:24

문제 링크 : www.acmicpc.net/problem/1766

 

1766번: 문제집

첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주

www.acmicpc.net

문제의 조건을 잘 살펴보자.

  1. N개의 문제는 모두 풀어야 한다.
  2. 먼저 푸는 것이 좋은 문제가 있는 문제는, 먼저 푸는 것이 좋은 문제를 반드시 먼저 풀어야 한다.
  3. 가능하면 쉬운 문제부터 풀어야 한다.

 

제시된 조건들을 봤을 때 문제집의 문제 간에는 선행 관계가 존재함을 알 수 있으며,

따라서 이 문제는 사이클이 없는 방향 그래프 내에서 위상 정렬의 결과를 출력하는 문제임을 캐치할 수 있다.

 

일반적인 위상 정렬은 여러 개의 결과를 낼 수 있지만,

이 문제의 경우 3번 조건에서 위상 정렬의 결과가 여러개 존재할 수 있다면 더 낮은 번호의 문제를 먼저 풀어야 하기 때문에, 단 하나의 결과만을 낼 수 있다.

 

[코드]

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <memory.h>
#include <string>
 
using namespace std;
typedef pair<intint> p;
typedef struct {
    int num, indegree = 0;
}node;
 
int n, m;
node nodes[32001];
vector<int> adj[32001], order;
 
void bfs() {
    priority_queue<int> pque;
    for (int i = 1; i <= n; i++) {
        if (nodes[i].indegree == 0) pque.push(-i);
    }
 
    while (!pque.empty()) {
        int cur = -pque.top();
        pque.pop();
 
        order.push_back(cur);
 
        for (int i = 0; i < adj[cur].size(); i++) {
            int nextnode = adj[cur][i];
            nodes[nextnode].indegree--;
            if (nodes[nextnode].indegree == 0) {
                pque.push(-nextnode);
            }
        }
    }
}
 
void init() {
    int a, b;
    cin >> n >> m;
    
    for (int i = 1; i <= n; i++) nodes[i].num = i;
 
    for (int i = 1; i <= m; i++) {
        cin >> a >> b;
        adj[a].push_back(b);
        nodes[b].indegree++;
    }
}
 
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(NULL);
 
    init();
    bfs();
 
    for (int i = 0; i < order.size(); i++printf("%d ", order[i]);
    printf("\n");
 
    //system("PAUSE");
    return 0;
}
cs

 

'알고리즘 > BOJ 문제풀이' 카테고리의 다른 글

[DP] BOJ 1029 그림 교환  (0) 2020.12.29
[Segtree] BOJ 7578 공장  (0) 2020.12.22
[DP] BOJ 2169 로봇 조종하기  (0) 2020.12.15
[Dijkstra] BOJ 13907 세금  (0) 2020.12.14
[Greedy] BOJ 9576 책 나눠주기  (0) 2020.12.06