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

이 문제는 그냥 최소 스패닝 트리 문제인데 조건이 하나가 더추가가됬다 같은 것 끼리만 연결안하고 연결될때마다 간선의 갯수를 측정해준다음 간선의 갯수가 n-1일 때는 다연결된거니 그냥 값 출력해주면 되고 아니면 -1출력해주면 된다

#include <iostream>
#include <queue>
using namespace std;
int n, m;
char arr[1000];
priority_queue<pair<int,pair<int,int>> , vector<pair<int, pair<int, int>>>,greater<pair<int, pair<int, int>>>> inputData;
int parent[1000];
int findParent(int x) {
	if (parent[x] == x)
		return x;
	else
		return parent[x] = findParent(parent[x]);
}
bool isSameParent(int x, int y) {
	int parentX = findParent(x);
	int parentY = findParent(y);

	if (parentX == parentY)
		return true;
	else
		return false;
}
void uni(int  x, int y) {
	int parentX = findParent(x);
	int parentY = findParent(y);

	parent[parentY] = parentX;
}
int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> arr[i];
		parent[i] = i;
	}
	int u, v, d;
	for (int i = 0; i < m; i++) {
		cin >> u >> v >> d;
		inputData.push({ d,{u,v} });
	}
	int ans = 0;
	int countRoad = 0;
	while (!inputData.empty()) {
		int cost = inputData.top().first;
		int from = inputData.top().second.first;
		int to = inputData.top().second.second;
		inputData.pop();
		if (!isSameParent(from, to) && (arr[from]!=arr[to])) {
			uni(to, from);
			ans += cost;
			countRoad += 1;
		}
	}
	if (countRoad == n - 1)
		cout << ans;
	else
		cout << -1;
}

'백준(코테준비) > 그래프' 카테고리의 다른 글

백준 16398  (0) 2025.02.02
백준 1005 / C++ / 위상정렬  (0) 2025.01.26
백준 6497 / 최소 스패닝 트리/ C++  (0) 2025.01.20
백준 2887 / C++ / 그래프 / 크루스  (0) 2025.01.12
백준 2252 / CPP / 위상 정렬  (1) 2024.12.01

+ Recent posts