티스토리 뷰

PS

[백준] 1922번 네트워크 연결

Eastplanet 2022. 5. 27. 00:41

문제 출처: https://www.acmicpc.net/problem/1922

 

1922번: 네트워크 연결

이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다.

www.acmicpc.net

MST를 구해서 가중치의 합을 구하는 문제입니다.

크루스칼 알고리즘에서 사이클이 생기지 않도록 간선을 정해야하기 때문에 같은 집합 여부를 확인하기 위해 유니온 파인드를 사용했다.

 

#include<iostream>
#include<queue>
#include<fstream>
#include<tuple>
#include<algorithm>

using namespace std;

struct P{
	int s, e, d=100000;
};
P arr[100000];

bool cmp(P a, P b) {
	return a.d < b.d;
}

int u[1001];

int find(int a) {
	if (u[a] < 0)return a;
	return u[a] = find(u[a]);
}

void merge(int a, int b) {
	a = find(a);
	b = find(b);
	if (a == b)return;
	if (u[a] < u[b]) {
		u[a] += u[b];
		u[b] = a;
	}
	else {
		u[b] += u[a];
		u[a] = b;
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N; cin >> N;
	int M; cin >> M;
	for (int i = 0; i < M; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		arr[i] = P{ a,b,c };
	}

	sort(arr, arr + M,cmp);
	fill(u, u + 1001, -1);
	int sum = 0;
	int count = 0;
	for (int i = 0; i < M; i++) {
		if (count == N - 1)break;

		P curr = arr[i];
		if (find(curr.s) == find(curr.e))continue;
		
		merge(curr.s, curr.e);
		sum += curr.d;
		count++;
	}

	cout << sum;
}

'PS' 카테고리의 다른 글

[백준] 14606번 피자(small)  (0) 2022.06.22
[백준] 1926번 그림 C++  (0) 2022.06.21
[백준] 1004번 어린왕자  (0) 2022.05.22
[백준] 2877번 4와 7 C++  (0) 2022.05.21
[백준] 1918번 후위 표기식 C++  (0) 2022.05.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함