Skip to content

Commit 883ef24

Browse files
committed
103번 위상 정렬(그래프 정렬) 수강 완료 (마지막 강의)
1 parent 9fada69 commit 883ef24

1 file changed

Lines changed: 83 additions & 0 deletions

File tree

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
## 문제)
2+
위상정렬은 어떤 일을 하는 순서를 찾는 알고리즘입니다.
3+
각각의 일의 선후관계가 복잡하게 얽혀있을 때 각각 일의 선후관계를 유지하면서 전체 일의
4+
순서를 짜는 알고리즘입니다.
5+
만약 아래와 같은 일의 순서를 각각 지키면서 전체 일의 순서를 정한다면
6+
1 4 //1번일을 하고 난 후 4번일을 해야한다.\\
7+
5 4\\
8+
4 3\\
9+
2 5\\
10+
2 3\\
11+
6 2
12+
13+
전체 일의 순서는 1, 6, 2, 5, 4, 3과 같이 정할 수 있다. 전체 일의 순서는 여러 가지가 있습
14+
니다 그 중에 하나입니다.
15+
16+
### 입력 설명
17+
첫 번째 줄에 전체 일의 개수 N과 일의 순서 정보의 개수 M이 주어집니다.
18+
두 번째 줄부터 M개의 정보가 주어집니다.
19+
20+
### 출력 설명
21+
전체 일의 순서를 출력합니다.
22+
23+
### 입력 예제
24+
6 6\\
25+
1 4\\
26+
5 4\\
27+
4 3\\
28+
2 5\\
29+
2 3\\
30+
6 2
31+
32+
33+
### 출력 예제
34+
1 6 2 5 4 3
35+
36+
### 모범 답안
37+
``` Cpp
38+
#include <iostream>
39+
#include <fstream>
40+
#include <vector>
41+
#include <algorithm>
42+
#include <queue>
43+
using namespace std;
44+
int main() {
45+
ios_base::sync_with_stdio(false);
46+
ifstream cin;
47+
cin.open("input.txt");
48+
int n = 0, m = 0, a = 0, b = 0, score = 0;
49+
cin >> n >> m;
50+
vector<vector<int>> graph(n + 1, vector<int>(n + 1, 0));
51+
// degree[i]: i번 작업을 하기전 해야하는 사전 작업 갯수
52+
vector<int> degree(n + 1);
53+
queue<int> Q;
54+
for (int i = 0; i < m; i++) {
55+
cin >> a >> b;
56+
graph[a][b] = 1;
57+
degree[b]++;
58+
}
59+
60+
for (int i = 1; i <= n; i++) {
61+
// 사전에 해야할 작업이 없을 경우 Q에 넣어두고 곧바로 처리할 작업으로 예약해 놓는다.
62+
if (degree[i] == 0) Q.push(i);
63+
}
64+
65+
while (!Q.empty()) {
66+
int now = Q.front();
67+
Q.pop();
68+
cout << now << " ";
69+
for (int i = 1; i <= n; i++) {
70+
// 현재(now) 작업이 사전에 처리해야할 작업인 대상을 찾아서 감소 시켜준다.
71+
// 왜냐하면 사전 작업이 끝났기 때문에
72+
if (graph[now][i] == 1) {
73+
degree[i]--;
74+
if (degree[i] == 0) {
75+
Q.push(i);
76+
}
77+
}
78+
}
79+
}
80+
81+
return 0;
82+
}
83+
```

0 commit comments

Comments
 (0)