๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Data Structure๐Ÿงถ

์œ„์ƒ ์ •๋ ฌ Topological Sort

by Jouureee 2021. 6. 13.

์œ„์ƒ ์ •๋ ฌ

์œ„์ƒ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜  (์œ„์ƒ : incoming edge)

์ผ์˜ ์ˆœ์„œ๋ฅผ ์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์„๋•Œ ๋งŽ์ด ์“ฐ์ธ๋‹ค.

 

 

 

์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŠน์ง• 

  1. DAG(direct acycle graph)์—์„œ ๊ฐ€๋Šฅํ•œ ์ •๋ ฌ ๋ฐฉ๋ฒ•์ด๋‹ค.
  2. ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์œ„์ƒ ์ •๋ ฌ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†๋‹ค.
  3. ์˜์กด์„ฑ์ด ์—†๋Š” ๋…ธ๋“œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์˜์กด์„ฑ ๋†’์€ ์ˆœ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. 

 

* ์‹œ๊ฐ„ ๋ณต์žก๋„ O(V+E)

 

์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆœ์„œ

  1. ๊ฐ vertex์˜ ์œ„์ƒ(incoming edge์ˆ˜)๋ฅผ ์ €์žฅํ•œ๋‹ค.
  2. ์œ„์ƒ์ด 0์ธ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•ด ๋ชจ๋‘ queue์— ๋„ฃ๋Š”๋‹ค.
  3. queue์—์„œ node๋ฅผ ๊บผ๋‚ด ์œ„์ƒ ์ •๋ ฌ์— ๋„ฃ์–ด์ค€๋‹ค.
  4. ์œ„์ƒ ์ •๋ณด๋ฅผ ํ•˜๋‚˜ ๋‚ฎ์ถ”๊ณ  ์—ฃ์ง€๋ฅผ ์—†์•ค๋‹ค.
  5. ์œ„์ƒ์ด 0์ด ๋œ ๋…ธ๋“œ๋“ค์„ ํ์— ์ €์žฅํ•œ๋‹ค.
  6. ๋ฐ˜๋ณต

 


 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ˆ์‹œ

์œ„์ƒ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ด๋ ‡๊ฒŒ ๋˜์–ด ์žˆ๊ณ  ๊ฐ ๋…ธ๋“œ์˜ ์œ„์ƒ ์ •๋ณด๊ฐ€ ํ‘œ์™€ ๊ฐ™์ด ๋˜์–ด์žˆ๋‹ค๊ณ  ๋ณด์ž!!

 

์šฐ์„  ์œ„์ƒ์ด 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

 

๋Œ“๊ธ€