백준 1197번 C++

yun·2023년 12월 18일
0

C++

목록 보기
5/41

그래프가 주어졌을 때, 그 그래프의 최소 스패닝 트리를 구하기

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

int parent[10001];

// 부모 노드 찾기
int find(int x) {
    if (parent[x] == x) return x;
    else return parent[x] = find(parent[x]);
}

// 두 집합을 합치기
void uni(int x, int y) {
    x = find(x);
    y = find(y);
    parent[y] = x;
}

// 두 노드가 같은 집합에 속해 있는지 확인
bool sameparent(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) return true;
    else return false;
}

int main() {
    int vertex, e;
    cin >> vertex >> e;
    int result = 0;
    vector<pair<int, pair<int, int>>> v;

    // 간선 정보 입력
    for (int i = 0; i < e; i++) {
        int from, to, cost;
        cin >> from >> to >> cost;
        v.push_back({cost, {from, to}});
    }

    // 비용 기준으로 정렬
    sort(v.begin(), v.end());

    // 초기화: 각 정점이 자기 자신을 가리키도록
    for (int i = 1; i <= vertex; i++) parent[i] = i;

    // Kruskal 알고리즘 수행
    for (int i = 0; i < v.size(); i++) {
    	// i번째 간선의 시작 노드와 끝 노드가 같은 부모를 갖지 않으면
        if (!sameparent(v[i].second.first, v[i].second.second)) {
        	// 두 집합을 합치고
            uni(v[i].second.first, v[i].second.second);
            // 간선의 가중치를 비용에 더함
            result += v[i].first;
        }
    }

    // 최소 신장 트리의 총 비용 출력
    cout << result;

    return 0;
}

0개의 댓글