※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 6497번 문제인 전력난이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/6497
6497번: 전력난
성진이는 한 도시의 시장인데 거지라서 전력난에 끙끙댄다. 그래서 모든 길마다 원래 켜져 있던 가로등 중 일부를 소등하기로 하였다. 길의 가로등을 켜 두면 하루에 길의 미터 수만큼 돈이 들
www.acmicpc.net
주어지는 그래프는 연결그래프이므로, MST(Minimum Spanning Tree; 최소 신장 트리)에 해당하는 가로등을 켜는 데에 사용해야하는 비용이 필요한 최소 비용이고, 따라서 MST를 이루지 않는 모든 도로의 가로등을 끄면 최대로 비용을 절약할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int uf[200000];
int findf(int x) {
if (x == uf[x]) return x;
return uf[x] = findf(uf[x]);
}
vector<pair<int,pair<int, int>>> edges;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, M; cin >> N >> M;
while (N) {
int ans = 0;
for (int i = 0; i < N; i++) uf[i] = i;
edges.clear();
while (M--) {
int x, y, d; cin >> x >> y >> d;
edges.emplace_back(make_pair(d, make_pair(x, y)));
ans += d;
}
sort(edges.begin(), edges.end());
for (auto e : edges) {
int d = e.first, x = e.second.first, y = e.second.second;
x = findf(x), y = findf(y);
if (x == y) continue;
uf[y] = x;
ans -= d;
}
cout << ans << '\n';
cin >> N >> M;
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17407 // C++] 괄호 문자열과 쿼리 (0) | 2021.10.19 |
---|---|
[BOJ 1493 // C++] 박스 채우기 (0) | 2021.10.18 |
[BOJ 18116 // C++] 로봇 조립 (0) | 2021.10.16 |
[BOJ 2515 // C++] 전시장 (0) | 2021.10.15 |
[BOJ 1202 // C++] 보석 도둑 (0) | 2021.10.14 |