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

+ Recent posts