์์ ์ ๋ ฌ
์์์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ (์์ : incoming edge)
์ผ์ ์์๋ฅผ ์ ํ ํ์๊ฐ ์์๋ ๋ง์ด ์ฐ์ธ๋ค.
์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ํน์ง
- DAG(direct acycle graph)์์ ๊ฐ๋ฅํ ์ ๋ ฌ ๋ฐฉ๋ฒ์ด๋ค.
- ์ฌ์ดํด์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์์ ์ ๋ ฌ ์ํ ํ ์ ์๋ค.
- ์์กด์ฑ์ด ์๋ ๋ ธ๋๋ถํฐ ํ๋์ฉ ์ฐจ๋ก๋๋ก ์ฒ๋ฆฌํ์ฌ ์์กด์ฑ ๋์ ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
* ์๊ฐ ๋ณต์ก๋ O(V+E)
์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์์
- ๊ฐ vertex์ ์์(incoming edge์)๋ฅผ ์ ์ฅํ๋ค.
- ์์์ด 0์ธ ๋ ธ๋๋ค์ ๋ํด ๋ชจ๋ queue์ ๋ฃ๋๋ค.
- queue์์ node๋ฅผ ๊บผ๋ด ์์ ์ ๋ ฌ์ ๋ฃ์ด์ค๋ค.
- ์์ ์ ๋ณด๋ฅผ ํ๋ ๋ฎ์ถ๊ณ ์ฃ์ง๋ฅผ ์์ค๋ค.
- ์์์ด 0์ด ๋ ๋ ธ๋๋ค์ ํ์ ์ ์ฅํ๋ค.
- ๋ฐ๋ณต
์๊ณ ๋ฆฌ์ฆ ์์
์์ ๊ทธ๋ํ๊ฐ ์ด๋ ๊ฒ ๋์ด ์๊ณ ๊ฐ ๋ ธ๋์ ์์ ์ ๋ณด๊ฐ ํ์ ๊ฐ์ด ๋์ด์๋ค๊ณ ๋ณด์!!
์ฐ์ ์์์ด 0์ธ ๋ ธ๋๋ค์ queue์ ๋ชจ๋ ๋ฃ๋๋ค.
1)
์์์ด 0์ธ ๋ ธ๋๊ฐ 1๋ฟ์ด๋ฏ๋ก queue์ 1์ ๋ฃ๊ณ
2)
sort๋ก ์ฎ๊ฒจ์ค๋ค
3)
1์ด ๊ฐ์ง๊ณ ์๋ ๋ ธ๋์ ์์์ ํ๋์ฉ ๋ฎ์ถ๋ค.
1. ๋จผ์ 2์ ์์์ ํ๋ ๋ฎ์ถฐ์ค ๋ค ์์์ด 0์ด ๋์์ ๋ queue์ push ํด์ค๋ค.
2. ๋ค์ 1์ด ๊ฐ์ง ๋ ธ๋ 4์ ์์์ ํ๋ ๋ฎ์ถฐ์ฃผ๊ณ ์์์ด 0์ผ ์ queue์ push ํด์ค๋ค.
4)
๋ค์ queue์์ 2๋ฅผ sort์ ๋ฃ๋๋ค.
2๊ฐ ๊ฐ์ง ์์ ๋ ธ๋ 5์ ์์์ ํ๋ ๋ฎ์ถ๊ณ 0์ด ๋์๋ค๋ฉด
5)
queue์ ๋ค์ ๋ ธ๋ 5๋ฅผ ๋ฃ์ด์ค๋ค.
6)
๋ค์ queue์ ์๋ 4๋ฅผ sort์ ๋ฃ์ด์ค๋ค.
4๊ฐ ๊ฐ์ง ๋ ธ๋ 3์ ์์์ ํ๋ ๋ฎ์ถ๋ค. ์ด๋ฒ์๋ 3์ ์์์ด 1์ด ๋์ด ์์ง queue์ ๋ค์ด๊ฐ ์ ์๋ค.
7)
queue์ ์๋ 5๋ฅผ sort์ ๋ฃ๋๋ค.
5๊ฐ ๊ฐ์ง ๋ ธ๋ 3์ ์์์ ํ๋ ๊ฐ์ ์ํจ ๋ค 3์ ์์์ด 0์ด ๋์์ผ๋ฏ๋ก
8)
queue์ ๋ฃ์ด์ค๋ค.
9) queue์ ์๋ 3์ sort์ ๋ฃ์ด์ค๋ค.
๋์ด์ queue์ ๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก ์ข ๋ฃํ๋ค. ๋์ด๋ค !!
์ด๋ฅผ ์ฝ๋๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
๋ฐฑ์ค์ ์ค์ธ์ฐ๊ธฐ ๋ฌธ์ ๊ฐ ์์์ ๋ ฌ์ ๋ํ์ ์ธ ๋ฌธ์ ๋ผ๊ณ ํ ์ ์๋ค. ํ์ด๋ณด๋๊ฒ์ ์ถ์ฒํ๋ค!!
c++ ์ฝ๋ :
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int* in;
queue<int> q;
int main(){
int N, M, v1, v2;
scanf("%d %d", &N, &M);
vector<vector<int> > v;
for(int i = 0; i < N + 1; i++)v.push_back(vector<int>());
in = new int[N+1];
for(int i = 0; i < N + 1; i++)in[i] = 0;
for(int i = 0 ; i < M; i++){
scanf("%d %d", &v1, &v2);
v[v1].push_back(v2);
in[v2] ++;
}
for(int i = 1; i <N+1; i++){
if(in[i] == 0) q.push(i);
}
while(!q.empty()){
int temp = q.front();
printf("%d ", temp);
q.pop();
for(int i = 0; i < v[temp].size(); i++){
if(--in[v[temp][i]] == 0)q.push(v[temp][i]);
}
}
}
์ฐธ๊ณ ๋ธ๋ก๊ทธ :
https://zoomkoding.github.io/algorithm/2019/07/02/Topological-Sort-1.html
'Data Structure๐งถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ทธ๋ํ ์ด๋ก - DFS์ BFS (0) | 2021.04.21 |
---|---|
LCS ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด DP (0) | 2021.03.01 |
๊ทธ๋ํ ์ด๋ก - ์ด๋ถ ๊ทธ๋ํ (0) | 2021.02.25 |
์ ๋ ฌ - ์ ํ, ๋ฒ๋ธ, ์ฝ์ , ๋ณํฉ, ํ, ํต (0) | 2021.02.19 |
๋๊ธ