🍞 Problem Solving/Baekjoon

[백준] 1647 도시 분할 c++

박빵이 2022. 9. 2. 00:43

풀이과정

크루스칼 알고리즘의 대표적인 문제다.

두 개의 마을로 나눠야 하니까  마지막 간선(가장 가중치가 큰 간선) 을 안 더해주면 된다.

 

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

int N, M, A, B, C;
int parent[100001];

vector <pair <int, pair <int, int>>> v;

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

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

	cin >> N >> M;
	for (int i = 1; i <= N; i++) {
		parent[i] = i;
	}
	for(int i = 0; i < M; i++){
		cin >> A >> B >> C;
		v.push_back({ C, {A, B} });
	}
	sort(v.begin(), v.end());

	int sum = 0;
	int cnt = 0;
	for (int i = 0; i < M; i++) {
		int cost = v[i].first;
		int start = v[i].second.first;
		int end = v[i].second.second;

		int a = getParent(start);
		int b = getParent(end);

		if (a == b) continue;
		if (a < b) parent[b] = a;
		else parent[a] = b;

		sum += cost;
		cnt++;

		if (cnt == N - 2) {
			cout << sum;
			break;
		}
	}
}