알고리즘 문제 해결/BOJ

[MST, 크루스칼] BOJ 6497 전력난 (C++)

jmkimmessi 2022. 7. 10. 00:00
반응형

https://www.acmicpc.net/problem/6497

 

6497번: 전력난

성진이는 한 도시의 시장인데 거지라서 전력난에 끙끙댄다. 그래서 모든 길마다 원래 켜져 있던 가로등 중 일부를 소등하기로 하였다. 길의 가로등을 켜 두면 하루에 길의 미터 수만큼 돈이 들

www.acmicpc.net

 

문제 해결 알고리즘

 

최소 스패닝 트리를 구하는 문제이다.

 

크루스칼 알고리즘으로 문제를 풀었다.

 

https://kimmessi.tistory.com/74?category=871925 

 

[알고리즘] 그리디 알고리즘 - 최소비용신장트리, 스케줄 짜기

탐욕 알고리즘이란? 작은 사례로 나누지 않고 탐욕스러운 선택을 sequence로 계속하면 답에 가까워진다. 선택과정(selection procedure) : 집합에 추가할 다음 원소를 고른다. 그 당시 최적을 선택하는

kimmessi.tistory.com

 

소스 코드

 

#include <bits/stdc++.h>
using namespace std;

bool flag;
int m, n, result = 0;

int parent[200001];
vector<tuple<int, int, int>> graph;

int find_parent(int x){
    if(parent[x] == x) return x;
    else return parent[x] = find_parent(parent[x]);
}

void unionVertex(int u, int v){
    flag = false;

    u = find_parent(u);
    v = find_parent(v);

    if(u == v) return;
    else{
        flag = true;
        parent[u] = v;
    }
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0);

    while(true){
        cin >> m >> n;

        if(m == 0 && n == 0) break;

        for(int i=0;i<m;i++) parent[i] = i;

        int a, b, c;
        for(int i=0;i<n;i++){
            cin >> a >> b >> c;

            graph.push_back({c, a, b});
            result += c;
        }

        sort(graph.begin(), graph.end());

        for(int i=0;i<n;i++){
            unionVertex(get<1>(graph[i]), get<2>(graph[i]));

            if(flag) result -= get<0>(graph[i]);                    
        }

        cout << result << '\n';

        for(int i=0;i<n;i++) graph.pop_back();
        result = 0;
    }
}
반응형