[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ์์์ ๋ ฌ(Topological Sort)
Topological Sort (์์ ์ ๋ ฌ)
Topological sort๋ Direct Acyclic Graph ์ ๊ฒฝ์ฐ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ฐฉํฅ์ด ์กด์ฌํ๋ ๊ทธ๋ํ์์ ๊ฐ vertex์ ์ ํ ์์ ์ ๋ณด๋ฅผ ์ ์งํ๋ฉด์ ๋ชจ๋ vertex๋ฅผ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
Type of Edges
์๊ณ ๋ฆฌ์ฆ์ ์์๋ณด๊ธฐ ์ ์, Direct Acyclic Graph๋ฅผ ์๊ธฐ ์ํด ๋ฐฉํฅ์ด ์๋ ๊ทธ๋ํ์์ DFS๋ฅผ ์คํํ ๋ ๋ํ๋๋ edge์ ์ข ๋ฅ๋ฅผ ๋จผ์ ์ ๋ฆฌํด๋ณด์.
- Tree Edge: ์๋ก์ด ์ ์ ์ ๋ง๋ฌ์ ๋ ์๊ธฐ๋ edge. Edge๋ ํ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ ์ด์ ๋ ๋ฐ์ํ๊ฒ ๋๋ค. Tree Edge๋ ์ด๋ค ์ ์ ์ด ์๋ก์ด ์ ์ ๊ณผ ์ฐ๊ฒฐ ๋ ๋ ์๊ธฐ๋ edge๋ฅผ ๋งํ๋ค.
- Back Edge: Back Edge๋ ํธ๋ฆฌ์์ ์์์ ์์นํ ๋ ธ๋๊ฐ ์กฐ์ ๋ ธ๋์ ์ด์ด์ง๋ edge๋ฅผ ๋งํ๋ค.
- Forward Edge: Forward Edge๋ ์กฐ์ ๋ ธ๋๊ฐ ์์ ๋ ธ๋์ ์ด์ด์ง๋ edge๋ฅผ ๋งํ๋ค.
- Cross Edge: ํ์ฌ ํ์์ค์ธ ํธ๋ฆฌ๊ฐ ๋ค๋ฅธ ํ์์ด ๋๋ ๋ค๋ฅธ ์๋ธํธ๋ฆฌ์ ์ด์ด์ง๋ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ edge๋ฅผ ๋งํ๋ค.
Edges in Undirected
Directed Acyclic Graph ์์๋, ์ ๋ค ๊ฐ์ edge ์ค ์กด์ฌํ ์ ์๋ edge๋ค์ด ์๋ค.
- Foward Edge : ์ฐ๋ฆฌ๋ forward edge๊ฐ ์กฐ์ ๋ ธ๋์ ์์ ๋ ธ๋๊ฐ ์ด์ด์ง๋ ๊ฒ์ด๋ผ๊ณ ์ ์ํ๋ค. ์ด ์ํฉ์์ ์์ ๋ ธ๋๋ ํ์ฌ ํ์ ์ค์ธ ๋ ธ๋์ฌ์ผ ํ๋๋ฐ, ํ์ฌ ํ์์ค์ธ ๋ ธ๋๊ฐ ๊ทธ ์กฐ์ ๋ ธ๋์ ์ฐ๊ฒฐ๋๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ ํ๋ค. ์์ ๋ ธ๋์ ๋๋ฌ ํ๋ค๋ ๊ฒ์ ์ด๋ฏธ ์กฐ์ ๋ ธ๋๊ฐ ํ์ ์ค ์ํ์ธ gray ์ํ์ธ ๊ฒ์ ์๋ฏธํ๊ณ , gray ์์ gray ๋ก์ ์ฐ๊ฒฐ์ ํ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
- Cross Edge : ๋ง์ฝ ์ด๋ค ๋ ์๋ธํธ๋ฆฌ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ํ์. ๊ทธ๋ ๋ค๋ฉด dfs์์ ํ ์๋ธํธ๋ฆฌ๋ฅผ ํ์ํ๋ฉด์ ๋ฐ๋ํธ์ ์์นํ ์๋ธํธ๋ฆฌ๊น์ง ํจ๊ป ํ์ํ ์ ๋ฐ์ ์๋ค. ์๋ํ๋ฉด dfs๋ ๋ ์ด์ ์งํํ ์๋ ๋ ธ๋๊ฐ ์์ ๋๊น์ง ๊ณ์ํด์ ๊ทธ๋ํ๋ฅผ ํ๊ณ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ๋ฐฉํฅ์ด ์๋ ๊ทธ๋ํ์์ ์กด์ฌํ๋ edge๋ Back Edge ์ Tree Edge ๋ฟ์ด๋ค.
Alogorithm
์์ ์ ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ๊ตฌํํ๋ค.
- DFS ํตํด ๊ทธ๋ํ์ ์ํ ๋ชจ๋ ๋ ธ๋๋ค์ finish time์ ๋งํนํ๋ค. ๐ฉ(V + E)
- ๊ฐ์ฅ ๋ฆ๊ฒ ๋๋ ๋ ธ๋๋ฅผ ๋งํฌ๋ ๋ฆฌ์คํธ ์ ์ผ ์์ ์์น์ํจ๋ค. ๐ฉ(V)
์ ๋ง ๋จ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ทธ๋ํ vertex์ ์์๋ ์ด๋ฏธ edge์ ๋ฐฉํฅ์ ์ํด ์ ๋ฆฌ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ๊ทธ๋ฅ dfs๋ก ๋ชจ๋ vertex๋ฅผ ํ์ํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๊ฐ ๋ณต์ก๋๋ DFS์ ์๊ฐ์ธ ๐ฉ(V+E) ๊ฐ ๋๋ค.
Example
๋ฐฑ์ค์ ์๋ ์์์ ๋ ฌ์ ์ฌ์ฉํด ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์.
๋ฌธ์
N๋ช ์ ํ์๋ค์ ํค ์์๋๋ก ์ค์ ์ธ์ฐ๋ ค๊ณ ํ๋ค. ๊ฐ ํ์์ ํค๋ฅผ ์ง์ ์ฌ์ ์ ๋ ฌํ๋ฉด ๊ฐ๋จํ๊ฒ ์ง๋ง, ๋ง๋ ํ ๋ฐฉ๋ฒ์ด ์์ด์ ๋ ํ์์ ํค๋ฅผ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ๋ก ํ์๋ค. ๊ทธ๋๋ง๋ ๋ชจ๋ ํ์๋ค์ ๋ค ๋น๊ตํด ๋ณธ ๊ฒ์ด ์๋๊ณ , ์ผ๋ถ ํ์๋ค์ ํค๋ง์ ๋น๊ตํด ๋ณด์๋ค.
์ผ๋ถ ํ์๋ค์ ํค๋ฅผ ๋น๊ตํ ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ก์ ๋, ์ค์ ์ธ์ฐ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1≤N≤32,000), M(1≤M≤100,000)์ด ์ฃผ์ด์ง๋ค. M์ ํค๋ฅผ ๋น๊ตํ ํ์์ด๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ํค๋ฅผ ๋น๊ตํ ๋ ํ์์ ๋ฒํธ A, B๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ ํ์ A๊ฐ ํ์ B์ ์์ ์์ผ ํ๋ค๋ ์๋ฏธ์ด๋ค.
ํ์๋ค์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค๋ถํฐ ์์์๋ถํฐ ์ค์ ์ธ์ด ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ต์ด ์ฌ๋ฌ ๊ฐ์ง์ธ ๊ฒฝ์ฐ์๋ ์๋ฌด๊ฑฐ๋ ์ถ๋ ฅํ๋ค.
ํ์ด
Topological Sort, ์์ ์ ๋ ฌ๋ก ํ ์ ์๋ ๋ฌธ์ ์ด๋ค. ์์ ์ ๋ ฌ์ DFS์์ ๊ฐ ๋ ธ๋์ ํ์์ด ์์ ํ ๋๋ ๋ ๊ทธ ์์๋ฅผ ๊ธฐ๋กํด๋๊ณ ์ต์ข ์ ์ผ๋ก๋ ๊ทธ ์ญ์์ผ๋ก ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค. ์์ ์ ๋ ฌ์ DAG(Directed Acyclic Graph), ์ฌ์ดํด์ด ์๋ ์ผ๋ฐฉํฅ ๊ทธ๋ํ์์๋ง ๊ฐ๋ฅํ๋ค. DFS๋ฅผ ์งํํ๋ฉด์ ํ์์ด ๋๋ ๋๋ง๋ค ์คํ์ ํด๋น ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ , ์ค๋ณต๋ ๋ ธ๋๋ฅผ ์ฐ์์ผ๋ก ํ์ํ์ง ์๋๋ก visited ๋งํน์ ํด์ค๋ค.
์ฝ๋
#include <cstdio>
#include <vector>
#include <stack>
#include <utility>
#include <algorithm>
using namespace std;
vector<vector<int>> adj (32001);
stack<int> lineup;
bool visited[32001];
void dfs (int s){
visited[s] = true;
for (int i = 0 ; i < adj[s].size() ; i++){
if (!visited[adj[s][i]]){
dfs(adj[s][i]);
}
}
lineup.push(s);
}
int main (){
int N, M;
scanf("%d %d", &N, &M);
for (int i = 0 ; i < M ; i++){
int a, b;
scanf("%d %d", &a, &b);
adj[a].push_back(b);
}
for (int i = 1 ; i <= N ; i++){
if (!visited[i]){
dfs(i);
}
}
while(!lineup.empty()){
printf("%d ", lineup.top());
lineup.pop();
}
}
'๐ฎ ์จ-์์ค > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote