티스토리 뷰
#include <stdio.h>
#include <math.h>
typedef struct Node{ //간선을 받을 구조체
int x;
int y;
double num;
}Node;
int find(int p[], int x) { //노드가 속한 부분집합의 대표노드 찾기
if(x == p[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, i, j;
Node key;
double sum = 0;
scanf("%d %d", &n, &m);
int p[n]; //노드가 속한 부분집합의 대표노드 저장
Node v[n]; //x좌표, y좌표, 몇번째?
Node g[(n*(n-1))/2 + m]; //몇번째 우주선, 몇번째 우주선, 우주선 사이의 길이 (간선)
int cnt = 0;
for(i=0; i<n; i++) { //우주선의 좌표 입력받기
p[i] = i;
scanf("%d %d", &v[i].x, &v[i].y);
v[i].num = i;
}
for(i=0; i<n; i++) { //입력받은 우주선의 모든 간선 구하기
for(j=i+1; j<n; j++) {
g[cnt].x = v[i].num;
g[cnt].y = v[j].num;
g[cnt].num = sqrt(pow((v[i].x-v[j].x), 2) + pow((v[i].y-v[j].y), 2));
cnt++;
}
}
for(i=0; i<m; i++) { //이미 이어져 있는 간선 입력받기
int c, d;
scanf("%d %d", &c, &d);
g[cnt].x = c-1;
g[cnt].y = d-1;
g[cnt].num = 0.0;
cnt++;
}
int gap=cnt/2;
while(1) { //shell sort
if(gap%2 == 0) gap++;
for(i=gap; i<cnt; i++) {
key = g[i];
for(j=i-gap; j>=0; j-=gap) {
if(key.num < g[j].num) g[j+gap] = g[j];
else break;
}
g[j+gap] = key;
}
if(gap == 1) break;
gap >>= 1;
}
for(i=0; i<cnt; i++) { //krustal 알고리즘
if(find(p, (int)g[i].x) != find(p, (int)g[i].y)) {
sum += g[i].num;
merge(p, (int)g[i].x, (int)g[i].y);
}
}
printf("%.2f", sum);
}
이 코드는 매우 시간이 느립니다, 더 빠른 코드는 백준에 있습니다.
풀이 : 최소 스패닝 트리, krustal 알고리즘
1. n, m을 입력받습니다.
2. n개의 좌표를 입력받습니다.
3. 입력 받은 좌표들의 모든 간선들을 구합니다.
4. 이미 이어져 있는 간선들을 입력받습니다.
5. 간선들을 정렬합니다.
6. krustal 알고리즘으로 최소 스패닝 트리를 구합니다.
7. MST의 가중치의 합을 출력합니다.
https://www.acmicpc.net/problem/1774
1774번: 우주신과의 교감
(1,1) (3,1) (2,3) (4,3) 이렇게 우주신들과 황선자씨의 좌표가 주어졌고 1번하고 4번이 연결되어 있다. 그렇다면 1번하고 2번을 잇는 통로를 만들고 3번하고 4번을 잇는 통로를 만들면 신들과 선자씨끼
www.acmicpc.net
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 13418번 학교 탐방하기 (백준) (0) | 2023.03.29 |
---|---|
c언어 14621번 나만 안되는 연애 (백준) (0) | 2023.03.29 |
c언어 1414번 불우이웃돕기 (백준) (0) | 2023.03.28 |
c언어 16398번 행성 연결 (백준) (0) | 2023.03.28 |
c언어 2473번 세 용액 (백준) (0) | 2023.03.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스택
- XOR
- Krustal
- 1835번
- 오프라인 쿼리
- 플로이드
- 누적합
- Lazy Propagation
- 누적 합
- 기하학
- 그래프
- java
- 1835
- C언어
- DFS
- C++
- 세그먼트 트리
- 최소 스패닝 트리
- PASCAL
- 정렬
- 그리디
- 백준
- union
- Segment Tree
- 최대공약수
- BFS
- find
- 브루트포스
- DP
- 덱
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함