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;
}