시나브로

1197. 최소 스패닝 트리 본문

알고리즘/백준

1197. 최소 스패닝 트리

혬혬 2020. 1. 17. 11:50
728x90

나는 크루스칼 알고리즘으로 mst를 구현하였다.

하지만, 이 소스에서는 개선점이 있다.

union-find 알고리즘을 사용해서 좀더 효율적으로 구현이 가능할 것 같다.  

#include<stdio.h>
#include<iostream>
using namespace std;

#define MAX_NUM 100010

int input[MAX_NUM][3];
int num;
int n = 0;
int m = 0;
void swap(int i ,int j) {
	int temp[3] = { input[i][0],input[i][1], input[i][2] };
	input[i][0] = input[j][0];
	input[i][1] = input[j][1];
	input[i][2] = input[j][2];
	input[j][0] = temp[0];
	input[j][1] = temp[1];
	input[j][2] = temp[2];
}
void quickSort(int first, int last)
{
	int pivot;
	int i;
	int j;
	int temp;

	if (first < last)
	{
		pivot = first;
		i = first;
		j = last;

		while (i < j)
		{
			while (input[i][2] <= input[pivot][2] && i < last)
			{
				i++;
			}
			while (input[j][2] > input[pivot][2])
			{
				j--;
			}
			if (i < j)
			{
				swap(i, j);
			}
		}

		swap(pivot, j);

		quickSort(first, j - 1);
		quickSort(j + 1, last);
	}
}
int kruskal() {
	int cycle_list[10001] = {0};
	int cost = 0;
	for (int i = 1; i <= n; i++)
		cycle_list[i] = i;
	int cycle_amount = 0;
	int i = 0;
	while (cycle_amount < n-1) {
		if (cycle_list[input[i][0]] != cycle_list[input[i][1]]) {
			if (cycle_list[input[i][0]] < cycle_list[input[i][1]]) {
				for (int h = 1; h <= n; h++) {
					if (cycle_list[input[i][1]] == cycle_list[h] && h != input[i][1]) {
						cycle_list[h] = cycle_list[input[i][0]];
					}
				}
				cycle_list[input[i][1]] = cycle_list[input[i][0]];
			}
			else {
				for (int h = 1; h <= n; h++) {
					if (cycle_list[input[i][0]] == cycle_list[h] && h != input[i][0]){
						cycle_list[h] = cycle_list[input[i][1]];
				}
			}
				cycle_list[input[i][0]] = cycle_list[input[i][1]];
			}
			cost += input[i][2];
			cycle_amount++;
		}
		i++;
	}
	return cost;
}
int main(void) {
	freopen("inp.inp", "r", stdin);
	freopen("out.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for (int i = 0; i < m; i++) {
		scanf("%d %d %d", &input[i][0], &input[i][1], &input[i][2]);
	}
	quickSort(0,m-1);
	printf("%d",kruskal());

	return 0;
}
728x90

'알고리즘 > 백준' 카테고리의 다른 글

13460. 구술 탈출 2  (0) 2020.06.03
13458. 시험감독  (0) 2020.06.01
1181. 단어 정렬  (0) 2020.01.16
15829. Hashing  (0) 2020.01.14
2075. N번째 큰 수  (0) 2020.01.14
Comments