250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- the midnight library
- 코딩테스트
- dfs
- 프로그래머스
- readingbook
- 알고리즘 문제
- STUDYENGLISH
- englishbook
- 원서읽자
- 알고리즘
- PyQt
- 쉬운 알고리즘 문제
- English
- sw expert
- 원서읽기
- SQL
- MySQL
- 코테 준비
- swexpertacademy
- 코테
- BFS
- D4
- 완전탐색
- 직무면접
- 백준
- 원서
- nightroutine
- sw expert academy
- 삼성
- 코테 대비
Archives
- Today
- Total
시나브로
1197. 최소 스패닝 트리 본문
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