전형적인 최소 신장 트리 문제

크루스칼 알고리즘으로 해결한 예시 코드를 남기기 위해 글 작성해둠

 

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

 

정답코드)

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

vector<int> parent;

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

void Union(int x, int y)
{
	x = Find(x);
	y = Find(y);
	if (x < y) parent[y] = x;
	else if (x > y) parent[x] = y;
}

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

	int V, E;
	cin >> V >> E;

	parent.resize(V + 1);
	for (int i = 1; i < V + 1; i++) {
		parent[i] = i;
	}

	vector<tuple<int, int, int>> costs(E); // cost, from, to
	int A, B, C;
	for (int i = 0; i < E; i++) {
		cin >> A >> B >> C;
		costs[i] = {C, A, B}; // sort 쉽게하려고 위치 바꿔주고
	}
	sort(costs.begin(), costs.end());

	int answer = 0, count = 0;
	for (auto t : costs) {
		int cost = get<0>(t);
		int from = get<1>(t);
		int to = get<2>(t);

		if (Find(from) != Find(to)) {
			answer += cost;
			Union(from, to);
			count++;		
		}

		if (count == V - 1) break;
	}

	cout << answer;

	return 0;
}