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 |