ํฐ์คํ ๋ฆฌ ๋ทฐ
Programming/์๊ณ ๋ฆฌ์ฆ
[์ต์์ ์ฅํธ๋ฆฌ] Prim-Jarnik ์๊ณ ๋ฆฌ์ฆ, Kruskal ์๊ณ ๋ฆฌ์ฆ
ํด๋์๊ทธ 2021. 12. 7. 04:46Prim-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();
}
๋ฐ์ํ
'Programming > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฉํฅ๊ทธ๋ํ] ์์์์ in-degree (์ง์ ์ฐจ์) ์ด์ฉํด์ ๊ตฌํ๊ธฐ (0) | 2021.12.07 |
---|---|
[๊ทธ๋ํ์ํ] (0) | 2021.12.07 |
[๊ทธ๋ํ] ์ธ์ ๋ฆฌ์คํธ, ์ธ์ ํ๋ ฌ (๋ฌด๋ฐฉํฅ) (0) | 2021.12.07 |
[ํด์ํ ์ด๋ธ] (0) | 2021.11.22 |
[ํ์ํธ๋ฆฌ] ์ด์งํ์ํธ๋ฆฌ (0) | 2021.10.20 |
๊ณต์ง์ฌํญ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ
- Total
- Today
- Yesterday
๋งํฌ
TAG
- CLOVAX
- ์ฝ๋ฉ๊ณต๋ถ
- lgaimers
- ํ ํฌ์๋ฐ
- MYSQL
- StableDiffusion
- ๊ธฐ์ ์ปจํผ๋ฐ์ค
- ๋ ผ๋ฌธ์ฝ๊ธฐ
- SKTECHSUMMIT
- dreambooth
- AIRUSH2023
- SQL
- ๋ ผ๋ฌธ๋ฆฌ๋ทฐ
- ๊ตฌ๊ธ์ฝ๋ฉ
- WGAN
- ํ์ด์ฌ
- ํ๋ก๊ทธ๋๋จธ์ค
- gan
- C์ธ์ด
- HyperCLOVA
- ์คํ ์ด๋ธ๋ํจ์
- ์ฝ๋ฉ์๋ฌ
- ์ฝํ ์ค๋น
- ํ์ด์ฌ์ฝํ
- ์ฝํ
- AI์ปจํผ๋ฐ์ค
- Aimers
- AIRUSH
- ๋๋ฆผ๋ถ์ค
- DALLE
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
๊ธ ๋ณด๊ดํจ