https://www.acmicpc.net/problem/21924
21924번: 도시 건설
첫 번째 줄에 건물의 개수 $N$ $(3 \le N \le 10^5 )$와 도로의 개수 $M$ $(2 \le M \le min( {N(N-1) \over 2}, 5×10^5)) $가 주어진다. 두 번째 줄 부터 $M + 1$줄까지 건물의 번호 $a$, $b$ $(1 \le a, b \le N, a ≠ b)$와 두
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
vector<pair<int, pair<int, int>>> vec;
int boss[100001];
int visit[100001] = { 0 };
int findBoss(int a) {
if (boss[a] == a)
return a;
else
return boss[a] = findBoss(boss[a]);
}
void setUnion(int a, int b) {
a = findBoss(a);
b = findBoss(b);
if (a != b)
boss[b] = a;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
long long sum = 0;
for (int i = 0; i < M; i++) {
int a, b, c;
cin >> a >> b >> c;
sum += c;
vec.push_back(make_pair(c, make_pair(a, b)));
}
sort(vec.begin(), vec.end());
for (int i = 1; i <= N; i++) {
boss[i] = i;
}
long long result = 0;
for (int i = 0; i < M; i++) {
int a = vec[i].second.first;
int b = vec[i].second.second;
if (findBoss(a) != findBoss(b)) {
setUnion(a, b);
visit[a] = 1;
visit[b] = 1;
result += vec[i].first;
}
}
for (int i = 1; i < N; i++) {
if (findBoss(i) != findBoss(i+1)) {
cout << -1;
return 0;
}
}
cout << sum - result;
return 0;
}
'APS > 백준' 카테고리의 다른 글
[1197] 최소 스패닝 트리 C++ (0) | 2022.03.15 |
---|---|
[5052] 전화번호 목록 (0) | 2022.03.15 |
[14716] 현수막 C++ (0) | 2022.03.05 |
[10816] 숫자 카드2 C++ (0) | 2022.03.03 |
[3745] 오름세 C++ (0) | 2022.03.02 |