Problem Solving/BOJ(백준)

[BOJ]백준 21924번: 도시 건설(C++)/MST

이진2 2021. 6. 17. 01:01

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

기본 MST 문제~!~!~!~!~!

#include <cstdio>
#include <vector>
#include <queue>
#define pii pair<int,int>
#define INF 987654321
using namespace std;

vector<vector<pii>> g;
int n, m;
long long sum;

long long prim() {
	priority_queue<pii> pq;
	vector<int> cost(n + 2, INF);
	vector<bool> visit(n + 2, false);

	long long ans = 0;
	pq.push(make_pair(0, 1));
	cost[1] = 0;

	while (!pq.empty()) {
		pii cur = pq.top(); pq.pop(); cur.first *= -1;
		if (visit[cur.second])continue;

		visit[cur.second] = 1;
		for (auto x : g[cur.second]) 
			if((cost[x.second]>x.first)&&!visit[x.second]){
				cost[x.second] = x.first;
				pq.push(make_pair(-cost[x.second], x.second));
		}
	}

	for (int i = 1; i <= n; i++) {
		if (cost[i] == INF)return -1;
		ans += cost[i];
	}
	return ans;
}

int main() {
	scanf("%d%d", &n, &m);
	g = vector<vector<pii>>(n + 1);
	for (int i = 0, a, b, c; i < m; i++) {
		scanf("%d%d%d", &a, &b, &c);
		g[a].push_back(make_pair(c, b));
		g[b].push_back(make_pair(c, a));
		sum += c;
	}
	long long ans = prim();
	printf("%lld", ans == -1 ? -1 : sum - ans);
	return 0;
}