Algorithm/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / C++] ์„ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ

meeeeejin 2021. 1. 26. 16:54

 

๋ฌธ์ œ ๋งํฌ: programmers.co.kr/learn/courses/30/lessons/42861

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์„ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ

4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

programmers.co.kr

 

ํ’€์ด

 

Kruskal(ํฌ๋ฃจ์Šค์นผ) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. 

 

  • ์„ฌ ์‚ฌ์ด์— ๋‹ค๋ฆฌ ์—ฐ๊ฒฐ์— ๋“œ๋Š” ๋น„์šฉ์ด ์ ์€ ์ˆœ์„œ๋Œ€๋กœ costs๋ฅผ ์ •๋ ฌํ•œ๋‹ค. 
  • set[i]๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. set[i]๋Š” i๋ฒˆ์งธ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์ด๋‹ค. ๋ถ€๋ชจ๋…ธ๋“œ๋ž€ i๋ฒˆ์งธ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ ์ค‘์—์„œ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ์ด๋‹ค. 
  • ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ0๊ณผ ๋…ธ๋“œ1์ด ์—ฐ๊ฒฐ๋˜๋ฉด set[0] = 0, set[1] = 0์ด ์ €์žฅ๋œ๋‹ค. 
  • ์ •๋ ฌ๋œ costs๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ์„ ๋ฐ˜๋ณตํ•œ๋‹ค. 
    - ์—ฐ๊ฒฐํ•  ๋‘ ๋…ธ๋“œ์˜ parent๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด( ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ ์ƒํƒœ )
    - ๋‘ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  parent๋ฅผ set์— ์ €์žฅํ•œ๋‹ค. 

 

 

* Kruskal's Algorithm ์ฐธ๊ณ 

2021/01/26 - [์•Œ๊ณ ๋ฆฌ์ฆ˜/์•Œ๊ณ ๋ฆฌ์ฆ˜] - [์•Œ๊ณ ๋ฆฌ์ฆ˜] MST(Minimum Spanning Tree, ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ) - Prim(ํ”„๋ฆผ), Kruskal(ํฌ๋ฃจ์Šค์นผ) ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜] MST(Minimum Spanning Tree, ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ) - Prim(ํ”„๋ฆผ), Kruskal(ํฌ๋ฃจ์Šค์นผ) ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ์ฐจ Spanning Tree ๊ฐœ๋… MST(์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ) ๊ฐœ๋… Prim's Algorithm Kruskal's Algorithm Spanning Tree (์‹ ์žฅ ํŠธ๋ฆฌ) ๊ทธ๋ž˜ํ”„ ๋‚ด์˜ ๋ชจ๋“  ์ •์ ๋“ค์„ ํฌํ•จํ•˜๋Š” ๊ทธ๋ž˜ํ”„์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ(subgraph) Tree ์ตœ์†Œํ•œ์˜ ๊ฐ„์„ ๋“ค๋กœ..

mjmjmj98.tistory.com

 

 

 

 

์†Œ์Šค์ฝ”๋“œ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <algorithm>
#include <string>
#include <vector>
 
using namespace std;
 
int set[101];   // node์˜ parent๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด
 
int getParent(int node) {
    if(set[node] == node) return node;
    return set[node] = getParent(set[node]);
}
 
bool cmp(vector<int> a, vector<int> b) {
    return a[2< b[2];
}
 
int solution(int n, vector<vector<int>> costs) {
    int answer = 0;
 
    for(int i = 0; i < n; i++)
        set[i] = i;
    
    sort(costs.begin(), costs.end(), cmp);  // ๋น„์šฉ์„ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
 
    for(int i = 0; i < costs.size(); i++) {
        int start = getParent(costs[i][0]);
        int end = getParent(costs[i][1]);
        int cost = costs[i][2];
 
        if(start != end) {  // cycle์ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋‹ค๋ฆฌ๋ฅผ ์ถ”๊ฐ€
            answer += cost;
            set[end= start;
        }
    }
 
    return answer;
}
cs

 

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

 

 

728x90