๐Ÿ“Œ ์‹ ์žฅํŠธ๋ฆฌ(Spanning Tree) : ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ์„ ๋•Œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜๋ฉด์„œ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„

 

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์‹ ์žฅ ํŠธ๋ฆฌ ์ค‘์—์„œ ์ตœ์†Œ ๋น„์šฉ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜, Union-FInd๋ฅผ ์ด์šฉ

 

1) ๊ฐ„์„  ๋ฐ์ดํ„ฐ๋ฅผ ๋น„์šฉ์— ๋”ฐ๋ผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

2) ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ ํ˜„์žฌ์˜ ๊ฐ„์„ ์ด ์‚ฌ์ดํด์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    2-1) ์‚ฌ์ดํด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ : ์ตœ์†Œ ์‹ ์žฅํŠธ๋ฆฌ์— ํฌํ•จ์‹œํ‚จ๋‹ค.

    2-2) ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ : ์ตœ์†Œ ์‹ ์žฅํŠธ๋ฆฌ์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

3) ๋ชจ๋“  ๊ฐ„์„ ์— ๋Œ€ํ•˜์—ฌ 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <tuple>

using namespace std;

// ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(v)์™€ ๊ฐ„์„ (e)์˜ ๊ฐœ์ˆ˜
// ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 100000๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
int v, e;
int parent[100001];

// ํŠน์ • ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์ฐพ๊ธฐ
int findParent(int x) {
     if (parent[x] != x) {
         parent[x] = findParent(parent[x]);
     }
     return parent[x];
 }

// ๋‘ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๊ธฐ
void unionParent(int x, int y) {
    x = findParent(x);
    y = findParent(y);

    if (x < y) {
        parent[y] = x;
    }
    else {
        parent[x] = y;
    }
}

int main(void) {
    vector<tuple<int, int, int> > edge;

    cin >> v >> e;

    // ๋ถ€๋ชจํ…Œ์ด๋ธ” ์ƒ์—์„œ, ๋ถ€๋ชจ๋ฅผ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ์ดˆ๊ธฐํ™”
    for (int i = 1; i <= v; i++) {
        parent[i] = i;
    }

    // union ์—ฐ์‚ฐ์„ ๊ฐ๊ฐ ์ˆ˜ํ–‰
    for (int i = 0; i < e; i++) {
        int a, b, d;
        cin >> a >> b >> d;
        edge.push_back(make_tuple(d, a, b));
    }

    // ๊ฐ„์„  ๊ฑฐ๋ฆฌ๋ณ„ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    sort(edge.begin(), edge.end()); // greater<int>()

    int sum = 0;
    for (auto t : edge) {
        int a, b, d;
        tie(d, a, b) = t;
        if (findParent(a) != findParent(b)) {
            unionParent(a, b);
            sum += d;
        }
    }
    
    cout << sum << endl;

    return 0 ;
}

๐Ÿ›‘ ์œ ์˜์‚ฌํ•ญ : template์—์„œ ์‚ฌ์šฉํ•œ tuple์€ c++11๋ฒ„์ „์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

+ Recent posts