※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1647번 문제인 도시 분할 계획이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1647
1647번: 도시 분할 계획
첫째 줄에 집의 개수N, 길의 개수M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 집
www.acmicpc.net
문제를 요약하면, 주어진 그래프의 2개의 트리로 구성된 포레스트 중 에지의 가중치의 합이 최소인 것의 그 가중치를 구하는 문제이다.
이는 그래프의 MST를 구하는 과정 중 마지막 에지를 더하는 단계를 생략하는 것으로 구할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int uf[100001];
int findf(int x) {
if (x == uf[x]) return x;
return uf[x] = findf(uf[x]);
}
struct edge {
ll w;
int x, y;
void mod(ll weight, int xx, int yy) {
w = weight, x = xx, y = yy;
}
};
bool comp(edge e1, edge e2) {
return e1.w < e2.w;
}
edge edges[1000000];;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, M; cin >> N >> M;
for (int i = 1; i <= N; i++) uf[i] = i;
for (int i = 0;i < M;i++) {
int x, y; ll w; cin >> x >> y >> w;
edges[i].mod(w, x, y);
}
sort(edges, edges + M, comp);
ll ans = 0;
int cnt = 0;
for (int i = 0; i < M; i++) {
if (cnt == N - 2) break;
int x = findf(edges[i].x), y = findf(edges[i].y);
if (x == y) continue;
ans += edges[i].w;
uf[y] = x;
cnt++;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 18263 // C++] Milk Visits (0) | 2021.07.23 |
---|---|
[BOJ 13913 // C++] 숨바꼭질 4 (0) | 2021.07.22 |
[BOJ 15480 // C++] LCA와 쿼리 (0) | 2021.07.20 |
[BOJ 3351 // C++] 삼각 분할 (0) | 2021.07.19 |
[BOJ 2570 // C++] 비숍2 (0) | 2021.07.18 |