※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts