백준 [1922] "네트워크 연결"

Kimbab1004·2024년 9월 5일
0

Algorithm

목록 보기
85/102

모든 컴퓨터를 최소 비용으로 연결, 모든 컴퓨터를 연결 할 수 없는 경우는 없다.

모든 정점이 연결되어 있어야 하고 이에 관한 최소비용을 찾기 위해서는 최소 스패닝 트리(MST) 알고리즘을 떠올렸어야 했는데 그러지 못했다.

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;

int n, m;
int uf[1000];
int output = 0;

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

int find(int x) {
	//자기 자신이 부모이면 
	if (x == uf[x]) return x;
	else return uf[x] = find(uf[x]);
}

void _union(int x, int y) {
	x = find(x);
	y = find(y);
	if (x > y) {
		uf[x] = y;
	}
	else {
		uf[y] = x;
	}
}

bool sameparent(int x, int y) {
	x = find(x);
	y = find(y);
	
	if (x == y) return true;
	else return false;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	cin >> n >> m;

	for (int i = 1; i <= n; i++) {
		uf[i] = i;
	}

	for (int i = 0; i < m; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		v.push_back({ c,{a,b} });
	}

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

	for (int i = 0; i < m; i++) {
		//2 3
		//4 5
		//1 3
		if (!sameparent(v[i].second.first, v[i].second.second)){
			_union(v[i].second.first, v[i].second.second);
			output += v[i].first;
		}
	}

	cout << output;

	return 0;
}

0개의 댓글