#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>
 
int V = 0;
int E = 0;
 
int answer = 0;
int parent[10001] = {};
std::vector<std::tuple<int, int,int>> graph = {};
 
bool cmp(std::tuple<int, int, int> tuple1, std::tuple<int, int, int> tuple2)
{
    if (std::get<2>(tuple1) == std::get<2>(tuple2))
        return std::get<0>(tuple1) <= std::get<1>(tuple2);
 
    else
        return std::get<2>(tuple1) < std::get<2>(tuple2);
}
 
int FindParent(int x)
{
    if (parent[x] == x)
        return x;
 
    else 
        return parent[x] = FindParent(parent[x]);
}
 
bool ParentCheck(int x, int y)
{
    x = FindParent(x);
    y = FindParent(y);
 
    if (x == y) 
        return true;
 
    else
    {
        parent[y] = x;
 
        return false;
    }
}
 
int main(void)
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL);
    std::cin >> V >> E;
 
    graph.resize(E);
 
    for (int i = 0; i < E; ++i)
    {
        int start = 0;
        int end = 0;
        int cost = 0;
        std::cin >> start >> end >> cost;
 
        graph[i] = { start, end, cost };
    }
 
    sort(graph.begin(), graph.end(), cmp);
 
    for (int i = 1; i <= V; ++i)
    {
        parent[i] = i;
    }
 
    for (int i = 0; i < E; ++i)
    {
        if (!ParentCheck(std::get<0>(graph[i]), std::get<1>(graph[i])))
        {
            answer = answer + std::get<2>(graph[i]);
        }
    }
 
    std::cout << answer;
 
    return 0;
}
 
 

문제 자체를 이해하기 어려웠습니다.

트리에 내부 순환하는 모든 간선들을 제거하고 가장 짧은 것들만 남기는 게 목적입니다.

그렇기 때문에 간선들의 비용을 가장 짧은 순서로 정렬해놓고 작은 순서대로 간선들을 설정해놓습니다.

그렇게 만들면 연결된 간선 중에 긴 간선들은 제거되면서 가장 짧은 간선들만 남습니다.

'오늘의 알고리즘' 카테고리의 다른 글

[C++] 백준 1208 부분수열의 합 2  (1) 2022.11.16
[C++] 백준 1202 보석 도둑  (0) 2022.11.13
[C++] 백준 1007 벡터 매칭  (0) 2022.11.12
[C++] 백준 12852 1로 만들기 2  (0) 2022.11.11
[C++] 백준 1005 ACM Craft  (0) 2022.11.10

+ Recent posts