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