ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Prim-Jarnik ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

- ๋ฌด๋ฐฉํ–ฅ๊ฐ„์„ ์ด๊ณ , ํ•œ ์ •์ ์—์„œ ์ž„์˜์˜ ๋‹ค๋ฅธ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” ๋ฐ˜๋“œ์‹œ ์กด์žฌ

- ๊ฐ„์„ ์˜ ๋ฌด๊ฒŒ๋Š” ์ค‘๋ณต์ด ์—†๋Š” ์–‘์˜ ์ •์ˆ˜

- ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰์˜ ์ถœ๋ฐœ์ •์ ์€ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅธ ์ •์ ์ธ 1๋ถ€ํ„ฐ ์‹œ์ž‘

 

#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTICES 100
#define INF 10000L

int n;
int weight[MAX_VERTICES][MAX_VERTICES];

int selected[MAX_VERTICES];
int d[MAX_VERTICES];// ๊ฐ„์„  ๋ฌด๊ฒŒ ์ €์žฅํ•  ๋ฐฐ์—ด

int getMinVertex(int n) {
	int u, i;
	for (i = 0; i < n; i++)
	{
		if (!selected[i])
		{
			u = i;
			break;
		}
	}

	for (i = 0; i < n; i++)
	{
		if (!selected[i] && (d[i] < d[u]))
			u = i;
	}

	return u;
}

void prim(int start, int n) {
	int u, v;

	for (u = 0; u < n; u++)// ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
		d[u] = INF;

	d[start] = 0;// ์‹œ์ž‘๊ฑฐ๋ฆฌ๋Š” 0์œผ๋กœ
	for (int i = 0; i < n; i++)
	{
		u = getMinVertex(n);// ๊ฑฐ๋ฆฌ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ์ •์  ๋ฐฐ๋‚ญ์— ์ง‘์–ด๋„ฃ๊ธฐ
		selected[u] = 1;

		if (d[u] == INF) return;
		printf("%d ", u + 1);// MST ์ƒ์„ฑ์‹œ ์ถ”๊ฐ€๋˜๋Š” ์ •์  ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅ
		for (v = 0; v < n; v++)
		{
			if (weight[u][v] != INF)
				if (!selected[v] && weight[u][v] < d[v])// ์ •์ ์ด ๋ฐฐ๋‚ ์— ์—†๊ณ , ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์ž‘๋‹ค๋ฉด
					d[v] = weight[u][v];// ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ
		}
	}
	printf("\n");
}

void main() {
	int m;
	int u, v, w;
	scanf("%d %d", &n, &m);// ์ •์  ๊ฐœ์ˆ˜ n, ๊ฐ„์„  ๊ฐœ์ˆ˜ m

	for (int i = 0; i < n; i++) {// ๊ฐ„์„  ์ •๋ณด์ €์žฅํ•  ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
		for (int j = 0; j < n; j++) {
			weight[i][j] = INF;
		}
	}

	for (int i = 0; i < m; i++) {// ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
		scanf("%d %d %d", &u, &v, &w);

		weight[u - 1][v - 1] = w;// ๋ฌด๋ฐฉํ–ฅ๊ฐ„์„ ์ด๋ฏ€๋กœ
		weight[v - 1][u - 1] = w;
	}

	prim(0, n);// ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ˜ธ์ถœ, ์ถœ๋ฐœ์ •์ ์€ ๊ฐ€์žฅ ๋น ๋ฅธ ์ •์ ์ธ 1๋ถ€ํ„ฐ ์‹œ์ž‘

	int sum = 0;
	for (int i = 0; i < n; i++) {// ๊ฐ„์„  ๋ฌด๊ฒŒ์˜ ์ดํ•ฉ ๊ณ„์‚ฐ
		sum += d[i];
	}
	printf("%d", sum);// ๊ฐ„์„  ๋ฌด๊ฒŒ์˜ ์ดํ•ฉ ์ถœ๋ ฅ
}

 

 

Kruskal ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

 

- ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ(MST) ์ƒ์„ฑ ๊ณผ์ •์—์„œ ์ถ”๊ฐ€๋˜๋Š” ๊ฐ„์„ ์˜ ๋ฌด๊ฒŒ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
- ๋ชจ๋“  ๊ฐ„์„ ์˜ ๋ฌด๊ฒŒ๋ฅผ ์ถœ๋ ฅํ•œ ํ›„, ๋งˆ์ง€๋ง‰ ์ค„์— MST ๊ฐ„์„  ๋น„์šฉ์˜ ํ•ฉ ์ฆ‰, ์ด๋ฌด๊ฒŒ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

# include <stdio.h>
# include <stdlib.h>
# pragma warning(disable:4996)

int n, m;

int** G;
int* parent;
int* weight;

int find(int u) {// u๊ฐ€ ์†Œ์†๋œ ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜
	while (parent[u] != u)
		u = parent[u];
	return u;
}

// ๋ฐฐ๋‚ญํ•ฉ์น˜๊ธฐ ์ˆ˜ํ–‰
void union_bag(int i, int j) {// ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ์ง‘ํ•ฉ์˜ ์›์†Œ๋“ค์„ ํฐ ์ง‘ํ•ฉ ๋ฆฌ์ŠคํŠธ๋กœ ์˜ฎ๊น€, ์›์†Œ๋“ค์˜ ์ฐธ์กฐ ๊ฐฑ์‹ 
	int a = find(i);
	int b = find(j);
	parent[a] = b;
}

void kruscalMST() {
	int sum = 0;
	int edge = 0;

	for (int i = 0; i < n; i++)
		parent[i] = i;

	while (edge < n - 1) {
		int min = 9999, a = -1, b = -1;

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (find(i) != find(j) && G[i][j] < min) {
					min = G[i][j];
					a = i;
					b = j;
				}
			}
		}
		union_bag(a, b);
		edge++;
		sum += min;
		printf(" %d", min);
	}
	printf("\n");
	printf("%d", sum);
}

void main() {
	int v1, v2, w;// ์ •์ , ์ •์ , ๋ฌด๊ฒŒ

	scanf("%d %d", &n, &m);
	G = (int**)malloc(sizeof(int*) * n);
	parent = (int*)malloc(sizeof(int) * n);
	weight = (int*)malloc(sizeof(int) * n);

	for (int i = 0; i < n; i++)
		G[i] = (int*)malloc(sizeof(int) * n);

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			G[i][j] = 9999;

	for (int i = 0; i < m; i++) {
		scanf("%d %d %d", &v1, &v2, &w);
		G[v1 - 1][v2 - 1] = w;
		G[v2 - 1][v1 - 1] = w;
	}

	kruscalMST();
}

 

๋ฐ˜์‘ํ˜•