์ด๋ฒ์ ์ด์ฐ์ํ ๊ณผ์ ๋ก ๋์จ ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ……
๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์์ ๊ฝค๋ ๋ง์ด ์ฐ์ธ๋ค๋๋ฐ……
(๋ฌผ๋ก ๋ค์ํ๊ฒ ์์ฉ ๊ฐ๋ฅ?!)

์ด๊ฒ ๊ฝค๋ ๋จธ๋ฆฌ๋ฅผ ์จ์ผ ๋ง๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ์
์ผ๋จ ์ดํด ํ๋ฉด์ ์ธ์ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ฝ๋ฉํ์๋ค.
์ํด ์ด๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ฃ์๋ง์ ๋ฐ๋ก ์งค์ ์๋ค๋ฉด ์ผ๋ง๋ ์ข์๊น?
์ ์ด์์ฌ ๋์๊ฒ ์ฒ์ฌ์ ์ฌ๋ฅ์ ์ ๋ฐ;;;;;
์์ธํ ์์ค๋ ๋ฐ์์ ๊ณ์~
[spoiler]
#include <stdio.h>
#include <malloc.h>
typedef struct edge // ๊ฐ์ ์ ๋ํ๋ด๋ ๊ตฌ์กฐ์ฒด
{
int vertex[2]; // ์์์ ๊ณผ ๋์
int cost; // ๊ฐ์ค์น
}Edge;
int **make_array(int n);// ๋ฐฐ์ด ๋ง๋ค๊ธฐ
void read_array(FILE *file, int *G[], int n);// ํ์ผ์์ ๋ฐฐ์ด๊ฐ ์ฝ๊ธฐ
void convert_array_to_edge(int* G[], Edge E[], int n);// ๋ฐฐ์ด์ ๊ฐ์ ์ผ๋ก ๋ณํ
void convert_edge_to_array(int* G[], Edge E[], int n, int m);// ๊ฐ์ ์ ๋ฐฐ์ด๋ก ๋ณํ
void print_edgy(Edge E[], int n);// ๊ฐ์ ์งํฉ ์ถ๋ ฅ
void kruskal(int n, int m, Edge E[], Edge F[]);// ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
void bubble_sort(Edge E[], int m);// ๊ฑฐํ ์ ๋ ฌ
void find_merge(int p, int q, int U[]);// ์งํฉ์ ํฉ์น๋ ํจ์
int find_set(int i, int U[]);// ํด๋น ์ ์ ์ด ์ด๋ค ์งํฉ์ ์ํ๋์ง ์ฐพ๋ ํจ์
int main()
{
int n, m; // n๊ฐ์ ์ ์ ๊ณผ m๊ฐ์ ๊ฐ์ ์ ์ ์ฅํ ๋ณ์
int **G; // ๋๋ธ ํฌ์ธํฐ๋ก ๋์ ๋ฐฐ์ด์ ์์ฑํ ๋ณ์ ์ ์ธ
int **result; // ์ต์์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ธ์ ๋ฐฐ์ด๋ก ๋ํ๋ด๊ธฐ ์ํ ๋ณ์ ์ ์ธ
Edge *E, *F;
FILE* file;
file = fopen(”kruskal_array.txt”, “r”);
if(file == NULL) {
perror(”File open error”);
return 0;
}
fscanf(file, “%d %d”, &n, &m); // ํ์ผ๋ก๋ถํฐ m, n์ ์
๋ ฅ ๋ฐ๋๋ค
E = (Edge *) malloc(sizeof(Edge)*(m-1)); // ์ฒ์ ์
๋ ฅ ๋ฐ์ ๋ฐฐ์ด์ ๊ฐ์ ์ผ๋ก ์ ์ฅํ๊ธฐ ์ํ Edge
F = (Edge *) malloc(sizeof(Edge)*(n-2)); // ์ต์๋น์ฉ ์ ์ฅํธ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ Edge
G = make_array(n); // ๋ฐฐ์ด ๋ง๋ค๊ธฐ
result = make_array(n);
read_array(file, G, n); // ํ์ผ์์ ๋ฐฐ์ด ์ ๋ณด ์ฝ๊ธฐ
convert_array_to_edge(G, E, n); // ๋ฐฐ์ด ์ ๋ณด๋ฅผ ๊ฐ์ ์ ๋ณด๋ก ๋ณํ
printf(”\n## Kruskal ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ ##\n”); // ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ฆฐ ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ๋ฅผ F ๊ฐ์ ์งํฉ์ ์ฝ์
kruskal(n, m, E, F); // ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ ๊ฒฐ๊ณผ ์ถ๋ ฅ
printf(”\n์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ ๊ฒฐ๊ณผ\n”);
print_edgy(F, n);
printf(”\n์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ ๊ฒฐ๊ณผ(์ธ์ ๋ฐฐ์ด)\n”);
convert_edge_to_array(result, F, n, m); // n-1๊ฐ์ ๊ฐ์ ์ด F์ ํฌํจ๋๋ฏ๋ก
fclose(file);
return 0;
}
void print_edgy(Edge E[], int n) // ๊ฐ์ ์งํฉ ์ถ๋ ฅ
{
int i;
for(i = 0; i < n; i++) {
if(E[i].cost != 0)
printf(”v%d -> v%d, ๊ฐ์ค์น = %d\n”, E[i].vertex[0]+1, E[i].vertex[1]+1, E[i].cost);
}
}
int** make_array(int n) // N x N ๋ฐฐ์ด ๋ง๋ค๊ธฐ
{
int i, j;
int** array; // N x N ๋์ ๋ฐฐ์ด์ ํ ๋น๋ฐ์ ๋๋ธ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธ
n–;
array = (int**)malloc(sizeof(int*)*n);
for(i = 0; i <= n; i++) {
array[i] = (int*)malloc(sizeof(int)*n);
}
for (i = 0; i <= n; i++) {
for (j = 0; j <= n; j++) {
array[i][j] = 0;
}
}
return array; // array์ ์ฃผ์๊ฐ์ ๋ฐํํด์ค๋ค
}
void read_array(FILE *file, int *G[], int n) // ํ์ผ์์ ๋ฐฐ์ด ๊ฐ์ ์ฝ์ด ๋ฐฐ์ด G์ ์ ์ฅ
{
int i, j;
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
fscanf(file, “%d”, &G[i][j]);
}
}
}
void convert_array_to_edge(int *G[], Edge E[], int n)// ๋ฐฐ์ด ์ ๋ณด๋ฅผ ๊ฐ์ ์ ๋ณด๋ก ๋ณํ
{
int i, j, num = 0;
for(i = 0; i < n; i++) { // ๋ฐฐ์ด์ ์ ๋ณด๋ฅผ ๊ฐ์ ๊ตฌ์กฐ์ฒด์ ์ฝ์
for(j = i; j < n; j++) {
if( G[i][j] != 0 && G[i][j] != 99 ) { // ๊ฐ์ค์น์ ๊ฐ์ด 1์์ 99 ์ฌ์ด๋ก ์กด์ฌํ ๋
E[num].vertex[0] = i; // i๋ฅผ ๋ฐฐ์ด ์ฒซ๋ฒ์งธ ์์์ ๋ฃ๋๋ค(๊ฐ์ ์ ์์์ )
E[num].vertex[1] = j; // j๋ฅผ ๋ฐฐ์ด ๋๋ฒ์งธ ์์์ ๋ฃ๋๋ค(๊ฐ์ ์ ๋์ )
E[num].cost = G[i][j]; // ๊ฐ์ค์น๋ฅผ ๋ฃ๋๋ค
num++; // E์ ๋ค์๋ฐฐ์ด์ ์ฆ๊ฐ์์ผ์ค๋ค
}
}
}
}
void convert_edge_to_array(int* G[], Edge F[], int n, int m)
{
int i, j;
int sum = 0;
int num = 0;
while (num < m) {
for (i = 0; i < n; i++) {
if (F[num].vertex[0] == i) {
for (j = 0; j < n; j++) {
if (F[num].vertex[1] == j) {
G[j][i] = F[num].cost;
G[i][j] = F[num].cost;
sum += F[num].cost;
continue;
}
}
}
}
num++;
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf(”%2d “, G[i][j]);
}
printf(”\n”);
}
printf(”์ด๋น์ฉ : %d\n”, sum);
}
void kruskal(int n, int m, Edge E[], Edge F[]) // ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
{
int start_vertex, end_vertax, i, current_edge;
int p, q; // ์๋ก์ ์ฒดํฌ๋ฅผ ์ํ ์งํฉ์ ๊ฐ๋ฆฌํค๋ ๋ณ์
int num = 0;
int* U = (int*)malloc(sizeof(int)*(n-1)); // ์งํฉ ์ ์ธ
Edge edge_temp;
printf(”\n์ ๋ ฌ ์ Edge E\n”);
print_edgy(E, m);
bubble_sort(E, m); // E์ ์ํ m๊ฐ์ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์์ ๊ฒ๋ถํฐ ์ฐจ๋ก๋ก ์ ๋ ฌ
printf(”\n์ ๋ ฌ ํ Edge E\n”);
print_edgy(E, m);
for (i = 0; i < n; i++) {// ์งํฉ Initialize
U[i] = i;
}
current_edge = 0;
while(num < n-1) { // ๊ฐ์ ์ ์๊ฐ n-1๋ณด๋ค ์์ ๋์
edge_temp = E[current_edge]; // ์์ง ๊ณ ๋ คํ์ง ์์ ๊ฐ์ ์ค ๊ฐ์ค์น๊ฐ ์ต์์ธ ๊ฐ์
start_vertex = E[current_edge].vertex[0]; // i, j = e์ ์ฐ๊ฒฐ๋ ์ ์
end_vertax = E[current_edge].vertex[1];
p = find_set(start_vertex, U); // start_vertax๊ฐ ์ํ๋ ์งํฉ์ p์ ์ ์ฅ
q = find_set(end_vertax, U); // end_vertax๊ฐ ์ํ๋ ์งํฉ์ q์ ์ ์ฅ
if(p != q ) { // p์ q ๊ฐ ์๋ก ์ํ ์งํฉ์ด ๋ค๋ฅด๋ค๋ฉด
find_merge(p, q, U); // p, q๊ฐ ์ํ ์งํฉ์ ํฉ์นจ
F[num] = edge_temp; // edge_temp๋ฅผ F์ ์ถ๊ฐ
num++;
}
current_edge++;
}
}
int find_set(int i, int U[]) // i๊ฐ ์งํฉ U์ ์ด๋ ์งํฉ์ ์ํ๋?
{
int j;
j = i;
while(U[j] != j) {
j = U[j];
}
return j;
}
void find_merge(int p, int q, int U[]) // p, q๋ฅผ ์งํฉ U์ ํฉ์นฉ
{
if (p < q) { // p๋ ํฉ๋ณ๋ ์งํฉ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
U[q] = p; // q๋ ๋ ์ด์ ์งํฉ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์๋
}
else {
U[p] = q;
}
}
void bubble_sort(Edge E[], int m) // E ์ฃ์ง ์งํฉ์ ๊ฐ์ค์น๋ฅผ ์ ๋ ฌํ๊ธฐ ์ํ ํจ์
{
int i, Sorted = 0;
Edge tmp;
while( !S
orted ) {// ์ ๋ ฌ์ด ์๋ฃ๋์ง ์์์ผ๋ฉด
Sorted = 1;
for(i = 1; i < m; i++) {
if( E[i-1].cost > E[i].cost ) {
tmp = E[i-1];
E[i-1] = E[i];
E[i] = tmp;
Sorted = 0;
}
}
}
}
[/spoiler]
๊ฒ์ ๋ ์ง : 6์ 9th, 2008
๊ธ ๋ถ๋ฅ :
ํ๋ก๊ทธ๋๋ฐ
ํ๊ทธ :
๊ณผ์ ,
๊ตฌ์กฐ,
๋น์ฉ,
์ํ,
ํธ๋ฆฌ,
์ ์ฅ,
์ด์ฐ,
์ด์ฐ์ํ,
์๋ฃ,
์๋ฃ๊ตฌ์กฐ,
์ต์,
์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ
๋จ๊น๋ง :
ํ๋๋ ์์ด์ฉ!.