c언어번호 16398 행성 연결 (백준)

#include <stdio.h>

typedef struct Node{ //간선을 받을 구조체
	int x; 
	int y;
	int v; //가중치
}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; scanf("%d", &n); int N = n*n; Node g(N); int p(n); for(int i=0; i<n; i++) { //간선을 행렬처럼 입력 받습니다.

p(i) = i; for(int j=0; j<n; j++) { g(i*n+j).x = i; g(i*n+j).y = j; scanf("%d", &g(i*n+j).v); } } int i, j, gap = N/2; Node key; while(1) { ///shell sort if(gap%2==0) gap++; for(i=gap; i<N; i++) { key = g(i); for(j=i-gap; j>=0; j-=gap) { if(key.v < g(j).v) g(j+gap) = g(j); else break; } g(j+gap) = key; } if(gap == 1) break; gap >>= 1; } long long int ans = 0; //값이 int형 범위를 넘어갈 수 있으니, long long int로 for(i=0; i<N; i++) { //krustal 알고리즘 if(find(p, g(i).x) !
= find(p, g(i).y)) { ans += g(i).v; merge(p, g(i).x, g(i).y); } } printf("%lld", ans); }

솔루션: Krustal 알고리즘

1. 매트릭스로 받은 데이터를 엣지 정보로 변환한다.

2. 가중치의 오름차순으로 가장자리를 정렬합니다.

3. Krustal 알고리즘을 사용하여 MST를 빌드합니다.

4. 최소 스패닝 트리(MST)의 총 중량을 인쇄하십시오. (long long int로 작성해야 함)

https://www.acmicpc.net/problem/16398

#16398: 행성 연결

홍익제국의 중심은 행성T다.

제국황제 윤석이는 행성T에서 제국을 효과적으로 통치하기 위해 N행성들 사이에 흐름을 만들고자 한다.

두 행성 사이에 강을 놓으면 임페리얼 큐브

www.acmicpc.net