Algorithm

[Algorithm] ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ : ํฌ๋ฃจ์Šค์ปฌ & ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

yevdev 2021. 10. 11. 11:18

๐Ÿ’ก์‹ ์žฅํŠธ๋ฆฌ?

  • ์ฃผ์–ด์ง„ ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด์„ ํ˜•์„ฑํ•˜๋Š” ๊ฐ„์„ ์„ ์ œ๊ฑฐํ•˜์—ฌ ๋งŒ๋“  ํŠธ๋ฆฌ
  • ์ •์ ์˜ ์ˆ˜๊ฐ€ n ๊ฐœ, ์‹ ์žฅํŠธ๋ฆฌ์˜ ๊ฐ„์„ ์˜ ์ˆ˜๋Š” n-1 ๊ฐœ

๐Ÿ’ก์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ?

  • ์ฃผ์–ด์ง„ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด์ด ์—†์ด ๋ชจ๋“  ์ ๋“ค์„ ์—ฐ๊ฒฐ์‹œํ‚จ ํŠธ๋ฆฌ๋“ค ์ค‘ ์„ ๋ถ„(๊ฐ„์„ )๋“ค์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ํŠธ๋ฆฌ

 

๐Ÿ’ก์–ด๋–ป๊ฒŒ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ฐพ์„๊นŒ?

  1. ๋ฌด์ž‘์œ„ ๊ธฐ๋ฒ•
    • ๊ฐ€๋Šฅํ•œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•œ ๋‹ค์Œ, ์ตœ์†Œ ๋น„์šฉ์˜ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์„ ํƒ
    • ๋ชจ๋“  ์ •์  ๊ฐ„์— ๊ฐ„์„ ์ด ์žˆ๋Š” ์™„์ „ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ ์‹ ์žฅ ํŠธ๋ฆฌ์˜ ์ˆ˜๋Š” n^(n-2)
  2. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ํฌ๋ฆฌ์Šค์ปฌ๊ณผ ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์žˆ์Œ
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋ ฅ์€ 1๊ฐœ์˜ ์—ฐ๊ฒฐ์š”์†Œ๋กœ ๋œ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์ด๋‹ค.

 


๐Ÿ’กํฌ๋ฆฌ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

  • ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์„ ๋ถ„์ด ์‚ฌ์ดํด์„ ๋งŒ๋“ค์ง€ ์•Š์„ ๋•Œ์—๋งŒ '์š•์‹ฌ๋‚ด์–ด' ๊ทธ ์„ ๋ถ„์„ ์ถ”๊ฐ€ ์‹œํ‚จ๋‹ค.
  1. ๊ฐ ๋‹จ๊ณ„์—์„œ ๊ฐ€์ค‘์น˜๊ฐ€ ์ตœ์†Œ์ธ ๊ฐ„์„  ์„ ํƒ (๊ฐ€์ค‘์น˜ ์ •๋ ฌ)
  2. ์„ ํƒํ•œ ๊ฐ„์„  ๋•Œ๋ฌธ์— ์‚ฌ์ดํด์ด ๋งŒ๋“ค์–ด์ง„๋‹ค๋ฉด ์„ ํƒํ•œ ๊ฐ„์„ ์„ ๋ฒ„๋ฆผ (union-find ์—ฐ์‚ฐ)
  3. ๋ฐ›์•„๋“ค์—ฌ์ง„ ๊ฐ„์„ ์˜ ์ˆ˜๊ฐ€ n-1๊ฐœ๊ฐ€ ๋˜๋ฉด ์ข…๋ฃŒ
// ์ž…๋ ฅ : ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ G=(V,E), |V|=n, |E|=m
// ์ถœ๋ ฅ : ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ T
// ๊ฐ€์ค‘์น˜์˜ ์˜ค๋ฆ„์ฐจ ์ˆœ์œผ๋กœ ์„ ๋ถ„๋“ค์„ ์ •๋ ฌํ•œ๋‹ค. ์ •๋ ฌ๋œ ์„ ๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ L์ด๋ผ๊ณ  ํ•˜์ž.
T=0		// ํŠธ๋ฆฌ T๋ฅผ ์ดˆ๊ธฐํ™” ์‹œํ‚จ๋‹ค.
while(T์˜ ์„ ๋ถ„ ์ˆ˜ < n-1){
	// L์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง„ ์„ ๋ถ„ e๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  e๋ฅผ L์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
    if (์„ ๋ถ„ e๊ฐ€ T์— ์ถ”๊ฐ€๋˜์–ด ์‚ฌ์ดํด์„ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉด)		// feasibility check
    	e๋ฅผ T์— ์ถ”๊ฐ€ ์‹œํ‚จ๋‹ค. 
    else		// e๊ฐ€ T์— ์ถ”๊ฐ€๋˜์–ด ์‚ฌ์ดํด์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ
    	e๋ฅผ ๋ฒ„๋ฆฐ๋‹ค.
}
return ํŠธ๋ฆฌ T		// T๋Š” ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์ด๋‹ค.

 

 

โ“์‚ฌ์ดํด์€ ์–ด๋–ป๊ฒŒ ํ™•์ธํ• ๊นŒ?

  • union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • (๋‘ ์›์†Œ๊ฐ€ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์— ์†ํ•  ๋•Œ) ๋‘ ์ง‘ํ•ฉ๋“ค์˜ ํ•ฉ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•˜๋Š” union
    • ํŠน์ •์›์†Œ๊ฐ€ ์–ด๋–ค ์ง‘ํ•ฉ์— ์†ํ•˜๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” find
    • ํฌ๋Ÿฌ์Šค์ปฌ์˜ MST ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์ดํด ๊ฒ€์‚ฌ์— ์‚ฌ์šฉ
    • ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ง‘ํ•ฉ์„ tree ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ
    • Find(a) : a๊ฐ€ ํฌํ•จ๋œ ์ง‘ํ•ฉ์„ ๊ตฌ์„ฑํ•˜๋Š” tree์˜ root ๋ฅผ return 
    • Union(a,b) : a์™€ b๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์— ์†ํ•˜๊ณ , ๊ฐ๊ฐ ์†ํ•œ tree์˜ root๋ผ๊ณ  ํ•  ๋•Œ, ๋‘ tree๋ฅผ mergeํ•˜์—ฌ ๋Œ€์‘๋˜๋Š” ๋‘ ์ง‘ํ•ฉ์˜ ํ•ฉ์ง‘ํ•ฉ (union)์„ ํ‘œํ˜„ํ•˜๋Š” tree๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
    • ๋‘์›์†Œ v์™€ u ๋ฐ ๊ทธ๋“ค์˜ ์†ํ•œ ์ง‘ํ•ฉ์„ unionํ•˜๋ ค๋ฉด, 
    • // v์™€ u์˜ root์„ ์ฐพ๊ธฐ
      a=find(v);
      b=find(u);
      
      if(a!=b){ 	// ๋งŒ์•ฝ ๊ฐ™์€ ๋ฃจํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, v์™€ u๋Š” 
      	// ๊ฐ™์€ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์ด๋‹ค.
          union(a,b);
      }
edge_set kruskal_MST(edge_set E, int n){
	sort(E);
    edge_set MST_E = {};
    for (i=0;i<n;i++) init_set(i);		// n๊ฐœ์˜ ์ง‘ํ•ฉ(ํŠธ๋ฆฌ)๋ฅผ ์ƒ์„ฑ
    while(MST_E์˜ ๊ฐ„์„ ์ˆ˜ < n-1){
    	e = (u,v) = E์˜ ์ตœ์†Œ ๊ฐ€์ค‘์น˜ ๊ฐ„์„ ;
        if(find(u) != find(v))		// u์™€ v๊ฐ€ ๋‹ค๋ฅธ ์ง‘ํ•ฉ(ํŠธ๋ฆฌ)์›์†Œ, ์„œ๋กœ์˜ ์ง‘ํ•ฉ์— ํ•ด๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด cycle X
        {
        	MST_E = MST_E || {(u,v)} ;
            union(u, v) // ๋‘ ์ง‘ํ•ฉ(ํŠธ๋ฆฌ)์„ ํ•ฉ๋ณ‘
        }
    }
    return MST_E;
}

 

๐Ÿ’กC++ ์ฝ”๋“œ

#include <iostream>
#include <vector>
using namespace std;

// ๊ฐ„์„ ๋“ค์˜ ์ •๋ณด 
class Edge{ 
    public: 
    int node[2]; 
    int distance; 
    Edge(int x, int y, int distance){
         this->node[0] = x; 
         this->node[1] = y; 
         this->distance = distance; 
    }
};


//quickSort ์ •๋ ฌํ•จ์ˆ˜
void quickSort(vector<Edge>& edges, int start, int end){
    if(start>=end) return;
    int key = start;
    int i = start+1;
    int j = end;
    int temp;

    while(i<=j){
        while(i<=end && edges[i].distance <= edges[key].distance)   i++;
        while(j>start && edges[j].distance >= edges[key].distance)  j--;
        if(i>j){
            temp = edges[j].distance;
            edges[j].distance = edges[key].distance;
            edges[key].distance = temp;
            temp = edges[j].node[0];
            edges[j].node[0] = edges[key].node[0];
            edges[key].node[0] = temp;
            temp = edges[j].node[1];
            edges[j].node[1] = edges[key].node[1];
            edges[key].node[1] = temp;
        } else{
            temp = edges[j].distance;
            edges[j].distance = edges[i].distance;
            edges[i].distance = temp;
            temp = edges[j].node[0];
            edges[j].node[0] = edges[i].node[0];
            edges[i].node[0] = temp;
            temp = edges[j].node[1];
            edges[j].node[1] = edges[i].node[1];
            edges[i].node[1] = temp;
        }
    }

    quickSort(edges, start, j-1);
    quickSort(edges, j+1, end);
}

int getRoot(int n, int root[]){
    if(root[n]==n) return n;
    return getRoot(root[n], root);
}

bool isCycle(int x, int y, int root[]){
    x = getRoot(x, root);
    y = getRoot(y, root);
    if(x==y) return true;
    else return false;
}

void unionRoot(int x, int y, int root[]){
    x = getRoot(x, root);
    y = getRoot(y, root);
    if(x < y) root[y] = x;
    else root[x] = y;
}

int main(){
    int n;  // ์ •์ ์˜ ๊ฐœ์ˆ˜
    int m;  // ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
    cin >> n >> m;

    vector<Edge> edges;

    // ์–‘ ๋ ์ธ๋ฑ์Šค x,y ์™€ ๊ฐ€์ค‘์น˜ ๊ตฌํ•˜๊ธฐ
    for(int i=0;i<m;i++){
        int x, y, w;
        cin >> x >> y >> w;
        edges.push_back(Edge(x, y, w));
    }

    quickSort(edges, 0, edges.size()-1);

    int root[n]; // root๋ฐฐ์—ด
    
    // ์ดˆ๊ธฐ root ๋ฐฐ์—ด์€ ์ž๊ธฐ์ž์‹ ์ด root ์ธ ์ƒํƒœ์ž„
    for( int i=1;i<=n;i++){
        root[i]=i;
    }

    int sum = 0; // ๊ฐ€์ค‘์น˜์˜ ํ•ฉ (result)
    for( int i=0;i<edges.size();i++ ){
        if(!isCycle(edges[i].node[0], edges[i].node[1], root)){
            sum+=edges[i].distance;
            unionRoot(edges[i].node[0], edges[i].node[1], root);
        }
    }

    cout << sum <<endl;

}

 

 

๐Ÿ’กํฌ๋Ÿฌ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

// ์ž…๋ ฅ : ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ G=(V,E), |V|=n, |E|=m
// ์ถœ๋ ฅ : ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ T
// (1) ๊ฐ€์ค‘์น˜์˜ ์˜ค๋ฆ„์ฐจ ์ˆœ์œผ๋กœ ์„ ๋ถ„๋“ค์„ ์ •๋ ฌํ•œ๋‹ค. ์ •๋ ฌ๋œ ์„ ๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ L์ด๋ผ๊ณ  ํ•˜์ž.
T=0		// (2) ํŠธ๋ฆฌ T๋ฅผ ์ดˆ๊ธฐํ™” ์‹œํ‚จ๋‹ค.
while(T์˜ ์„ ๋ถ„ ์ˆ˜ < n-1){ // (3)
	// L์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง„ ์„ ๋ถ„ e๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  e๋ฅผ L์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
    if (์„ ๋ถ„ e๊ฐ€ T์— ์ถ”๊ฐ€๋˜์–ด ์‚ฌ์ดํด์„ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉด)		// feasibility check
    	e๋ฅผ T์— ์ถ”๊ฐ€ ์‹œํ‚จ๋‹ค. 
    else		// e๊ฐ€ T์— ์ถ”๊ฐ€๋˜์–ด ์‚ฌ์ดํด์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ
    	e๋ฅผ ๋ฒ„๋ฆฐ๋‹ค.
}
return ํŠธ๋ฆฌ T		// T๋Š” ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์ด๋‹ค.

(1) ์ •๋ ฌํ•˜๋Š”๋ฐ O(mlogm) ์‹œ๊ฐ„. ๋‹จ, m์€ ์ž…๋ ฅ๊ทธ๋ž˜ํ”„์— ์žˆ๋Š” ์„ ๋ถ„์˜ ์ˆ˜

(2) T๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ O(1) ์‹œ๊ฐ„

(3-1) ์ตœ์•…์˜ ๊ฒฝ์šฐ m๋ฒˆ ์ˆ˜ํ–‰(๊ฐ๊ฐ์˜ ์„ ๋ถ„ m๊ฐœ์— ๋Œ€ํ•ด์„œ ์ˆ˜ํ–‰) = ์ฆ‰, ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์„ ๋ถ„์ด while-๋ฃจํ”„ ๋‚ด์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ

(3-2) while ๋ฃจํ”„ ๋‚ด์—์„œ L๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ ์„ ๋ถ„ e๊ฐ€ ์‚ฌ์ดํด์„ ๋งŒ๋“œ๋Š” ์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š”๋ฐ, ์ด๋Š” O(log*m) ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

(3) while-loop = m*O(log*m)

๋”ฐ๋ผ์„œ, ํฌ๋Ÿฌ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(mlogm) + O(mlog*m) = O(mlogm) ์ด๋‹ค. (์ •๋ ฌ + while)

 

โžฐlog*n ?

  • O(mlog*m) = O(m)
  • logํ•จ์ˆ˜๋ฅผ n์— ์—ฐ์†ํ•ด์„œ ๋ช‡๋ฒˆ์ด๋‚˜ ์ ์šฉํ•ด์•ผ 1 ์ดํ•˜๊ฐ€ ๋˜๋Š”๊ฐ€?

 

โžฐ๊ณต๋ถ€ ๊ธฐ๋ก

 


๐Ÿ’กํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์ฃผ์–ด์ง„ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ์ž„์˜์˜ ์  ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•œ ํ›„, ๊ทธ ์ ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ ์ ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„, ๊ฐ€์žฅ ์งง์€ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ์ ์„ ์ถ”๊ฐ€์‹œ์ผœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ๊ฒฐ๊ตญ n-1๊ฐœ์˜ ์„ ๋ถ„์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€์‹œ์ผœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ํšจ๊ณผ์ธ๊ฒƒ!
  • ์ถ”๊ฐ€๋˜๋Š” ์„ ๋ถ„์€ ํ˜„์žฌ๊นŒ์ง€ ๋งŒ๋“ค์–ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐ์‹œํ‚ฌ ๋•Œ, '์š•์‹ฌ์„ ๋‚ด์–ด์„œ' ํ•ญ์ƒ ์ตœ์†Œ์˜ ๊ฐ€์ค‘์น˜๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ์„ ๋ถ„์ด๋‹ค
// ๊ทธ๋ž˜ํ”„ G์—์„œ ์ž„์˜์˜ ์  p๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์„ ํƒํ•˜๊ณ , D[p] = 0์œผ๋กœ ๋†“๋Š”๋‹ค.
// ๋ฐฐ์—ด D[v]๋Š” T์— ์žˆ๋Š” ์  u์™€ v๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ ๋ถ„์˜ ์ตœ์†Œ ๊ฐ€์ค‘์น˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์›์†Œ์ด๋‹ค.
for (์  p๊ฐ€ ์•„๋‹Œ ์  v์— ๋Œ€ํ•˜์—ฌ) {		// ๋ฐฐ์—ด D์˜ ์ดˆ๊ธฐํ™”
	if (์„ ๋ถ„ (p,v)๊ฐ€ ๊ทธ๋ž˜ํ”„์— ์žˆ์œผ๋ฉด)
    	D[v] = ์„ ๋ถ„ (p,v)์˜ ๊ฐ€์ค‘์น˜
    else
    	D[v] = ๋ฌดํ•œ๋Œ€
}
T={p}		//์ดˆ๊ธฐ์˜ ํŠธ๋ฆฌ T๋Š” ์  p๋งŒ์„ ๊ฐ€์ง„๋‹ค.
while(T์— ์žˆ๋Š” ์ ์˜ ์ˆ˜ < n){
	// T์— ์†ํ•˜์ง€ ์•Š์€ ๊ฐ ์  v์— ๋Œ€ํ•˜์—ฌ, D[v]๊ฐ€ ์ตœ์†Œ์ธ ์  v(min)๊ณผ ์—ฐ๊ฒฐ๋œ ์„ ๋ถ„(u,v(min))์„ T์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    // ๋‹จ, u๋Š” T์— ์†ํ•œ ์ ์ด๊ณ , ์  v(min)๋„ T์— ์ถ”๊ฐ€๋œ๋‹ค.
    for(T์— ์†ํ•˜์ง€ ์•Š์€ ๊ฐ ์  w์— ๋Œ€ํ•ด์„œ){
    	if(์„ ๋ถ„(v(min), w)์˜ ๊ฐ€์ค‘์น˜ < D[w])
        	D[w] = ์„ ๋ถ„(v(min), w)์˜ ๊ฐ€์ค‘์น˜		// D[w]๋ฅผ ๊ฐฑ์‹ 
    }
}
return T 	// T๋Š” ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์ด๋‹ค.

โ“ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ตœ์ข…์ ์œผ๋กœ ๋ฆฌํ„ดํ•˜๋Š” T์—๋Š” ์™œ ์‚ฌ์ดํด์ด ์—†์„๊นŒ?

  • ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•ญ์ƒ T๋ฐ–์— ์žˆ๋Š” ์ ์„ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ์‚ฌ์ดํด์ด ํ˜•์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค.

โ“ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•ญ์ƒ MST๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ด์œ ?

  • ํ•ญ์ƒ T๋ฐ–์— ์žˆ๋Š” ์ ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์˜ ๊ฐฑ์‹ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ€์ค‘์น˜์˜ ์ตœ์†Œ ์ •๋ ฌ๋Œ€๋กœ T์— ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ!?

 

 

 

๐Ÿ’กํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„

  • while๋ฃจํ”„๊ฐ€ (n-1)๋ฒˆ ๋ฐ˜๋ณต๋˜๊ณ , 1ํšŒ ๋ฐ˜๋ณต๋  ๋•Œ, T์— ์†ํ•˜์ง€ ์•Š์€ ๊ฐ ์  v์— ๋Œ€ํ•˜์—ฌ, D[v]๊ฐ€ ์ตœ์†Œ์ธ ์  v(min)์„ ์ฐพ๋Š”๋ฐ O(n) ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. 
    • 1์ฐจ์› ๋ฐฐ์—ด D์—์„œ (ํ˜„์žฌ T์— ์†ํ•˜์ง€ ์•Š์€ ์ ๋“ค์— ๋Œ€ํ•ด์„œ) ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด๊ณ , ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” ๊ทธ๋ž˜ํ”„์˜ ์ ์˜ ์ˆ˜์ธ n์ด๊ธฐ ๋•Œ๋ฌธ
  • ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ : (n-1)xO(n) = O(n^2)
// Setting ๊ณผ์ • ์ƒ๋žต
while(T์— ์žˆ๋Š” ์ ์˜ ์ˆ˜ < n){ // O(n). ๋งค๋ฒˆ edge ํ•œ๊ฐœ์”ฉ ์ถ”๊ฐ€. ์ด n-1๊ฐœ
	// T์— ์†ํ•˜์ง€ ์•Š์€ ๊ฐ ์  v์— ๋Œ€ํ•˜์—ฌ, D[v]๊ฐ€ ์ตœ์†Œ์ธ ์  v(min)๊ณผ ์—ฐ๊ฒฐ๋œ ์„ ๋ถ„(u,v(min))์„ T์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    // ๋‹จ, u๋Š” T์— ์†ํ•œ ์ ์ด๊ณ , ์  v(min)๋„ T์— ์ถ”๊ฐ€๋œ๋‹ค.
    for(T์— ์†ํ•˜์ง€ ์•Š์€ ๊ฐ ์  w์— ๋Œ€ํ•ด์„œ){
    	if(์„ ๋ถ„(v(min), w)์˜ ๊ฐ€์ค‘์น˜ < D[w])
        	D[w] = ์„ ๋ถ„(v(min), w)์˜ ๊ฐ€์ค‘์น˜		// O(n)
    }
}
return T 	// T๋Š” ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์ด๋‹ค.

 

โžฐ๊ณต๋ถ€ ๊ธฐ๋ก


๐Ÿ’กํฌ๋ฆฌ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ vs ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํฌ๋ฆฌ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์„ ๋ถ„์ด 1๊ฐœ์”ฉ T์— ์ถ”๊ฐ€๋˜๋Š”๋ฐ, ์ด๋Š” ๋งˆ์น˜ n๊ฐœ์˜ ์ ๋“ค์ด ๊ฐ๊ฐ์˜ ํŠธ๋ฆฌ์ธ ์ƒํƒœ์—์„œ ์„ ๋ถ„์ด ์ถ”๊ฐ€๋˜๋ฉด 2๊ฐœ์˜ ํŠธ๋ฆฌ๊ฐ€ 1๊ฐœ์˜ ํŠธ๋ฆฌ๋กœ ํ•ฉ์ณ์ง€๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
  • ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ 1๊ฐœ์˜ ํŠธ๋ฆฌ์ธ T๋ฅผ ๋งŒ๋“ ๋‹ค. ์ฆ‰, n๊ฐœ์˜ ํŠธ๋ฆฌ๋“ค์ด ์ ์ฐจ ํ•ฉ์ณ์ ธ์„œ 1๊ฐœ์˜ ์‹ ์žฅ ํŠธ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • T๊ฐ€ ์  1๊ฐœ์ธ ํŠธ๋ฆฌ์—์„œ ์‹œ์ž‘๋˜์–ด, ์„ ๋ถ„์„ 1๊ฐœ์”ฉ ์ถ”๊ฐ€์‹œํ‚จ๋‹ค. ์ฆ‰, 1๊ฐœ์˜ ํŠธ๋ฆฌ๊ฐ€ ์ž๋ผ๋‚˜์„œ ์‹ ์žฅํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค.

 


์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ ์‘์šฉ

  • ์ตœ์†Œ ๋น„์šฉ์œผ๋กœ ์„ ๋กœ ๋˜๋Š” ํŒŒ์ดํ”„ ๋„คํŠธ์›Œํฌ๋ฅผ ์„ค์น˜ํ•˜๋Š”๋ฐ ํ™œ์šฉ
  • ์—ฌํ–‰์ž ๋ฌธ์ œ๋ฅผ ๊ทผ์‚ฌ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์ด์šฉ

 


Reference

์„œ์šธ๊ณผํ•™๊ธฐ์ˆ ๋Œ€ํ•™๊ต ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—