티스토리 뷰
#include <stdio.h>
typedef struct Node{ //간선을 담을 구조체
int x;
int y;
int v;
}Node;
void shell(Node v[], int m) { //shell 정렬
int i, j, gap = m/2;
Node key;
while(1) {
if(gap%2 == 0) gap++;
for(i=gap; i<m; i++) {
key = v[i];
for(j=i-gap; j>=0; j-=gap) {
if(key.v < v[j].v) v[j+gap] = v[j];
else break;
}
v[j+gap] = key;
}
if(gap == 1) break;
gap >>= 1;
}
}
int find(int p[], int x) { //노드가 속한 부분집합의 대표노드 찾기
if(p[x] == x) return x;
return p[x] = find(p, p[x]);
}
void merge(int p[], int x, int y) {//두개의 노드의 부분집합 합치기
x = find(p, x);
y = find(p, y);
if(x!=y) p[x] = y;
}
int main(void) {
int n, m;
scanf("%d %d", &n, &m);
int p[n+1];
Node v[m];
for(int i=1; i<=n; i++) p[i] = i;
for(int i=0; i<m; i++) scanf("%d %d %d", &v[i].x, &v[i].y, &v[i].v);
shell(v, m);
int ans = 0;
for(int i=0; i<m; i++) { //Krustal 알고리즘
if(find(p, v[i].x) != find(p, v[i].y)) {
ans += v[i].v;
merge(p, v[i].x, v[i].y);
}
}
printf("%d", ans);
}
풀이 : Krustal 알고리즘
1. 간선의 정보를 담아즐 구조체를 정의합니다.
2. n, m입력받기
3. 부분집합의 대표 노드를 담을 배열을 생성합니다.
4. 2.의 배열을 대표노드를 자신으로 값을 넣어줍니다.
5. 간선 입력받습니다.
6. 간선들을 가중치로 오름차순 정렬을 합니다 (저는 shell 정렬을 했습니다. 퀵정렬이 더 빠를 것입니다)
7. Krustal 알고리즘을 사용합니다
8. 최소 스패닝 트리의 전체 가중치를 출력합니다.
https://www.acmicpc.net/problem/1922
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 2467번 용액 (백준) (0) | 2023.03.27 |
---|---|
c언어 6497번 전력난 (백준) (2) | 2023.03.26 |
c언어 2887번 행성 터널 (백준) (1) | 2023.03.25 |
c언어 1647번 도시 분할 계획 (백준) (0) | 2023.03.25 |
c언어 1197번 최소 스패닝 트리 (백준) (0) | 2023.03.25 |
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 6198
- BFS
- 정렬
- 스택
- 오프라인 쿼리
- DFS
- C++
- 1835번
- 그리디
- 16120번
- C언어
- 최대공약수
- 트리
- 6198번
- Krustal
- Mo.s
- 백준
- union
- 덱
- 세그먼트 트리
- find
- 누적 합
- 플로이드
- 최소 스패닝 트리
- 카드
- DP
- java
- 누적합
- 1835
- 그래프
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함