์ด๋ฒ์๋ ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค
๋ฌผ๋ก ์ญ์ ์ด์ฐ์ํ ๊ณผ์ ๋ก ๋์จ ๋
์์ด๋ค
์ ๋ ฌ์ ๋ญ๋๋ญ๋ํด๋ ๊ฐ๋งํ ๋ฒ๋ธ์ ๋ ฌ ๋งํ๊ฒ ์๋ค๋..?!;;;;;
์์๊ธฐ ๊ต์๋์ด ๋ค์ผ๋ฉด ์ธ๋ฅ์
๋ง์ ์๋ฆฌ๋ฅผ ๋๋;;

์์ธํ ์์ค๋ ๋ฐ์์ +_+ใ
[spoiler]
// ์ด์ฐ์ํ ํต์ํธ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
#include <stdio.h>
#define ELEMENT int // ์
๋ ฅ๋ฐ์ ์๋ฃํ
#define MAX_LIST_SIZE 8 // ์
๋ ฅ ๋ฐ์ ์๋ฃ์ ์
// ํจ์ ํ๋กํ ํ์
void quick_sort(ELEMENT list[], int left, int right); // ํต์ ๋ ฌ ํจ์
int partition(ELEMENT list[], int left, int right); // ํต์ ๋ ฌ ํจ์ ์์์ ํผ๋ฒ๊ธฐ์ค ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋๋ ํจ์
void swap(int *row, int *high); // ๊ฐ์ ์๋ก ๊ตํํด์ฃผ๋ ํจ์
void display_list(ELEMENT list[]); // ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ ํจ์
// ํจ์ ๋ณธ์ฒด
void display_list(ELEMENT list[])
{
int i;
for (i = 0; i < MAX_LIST_SIZE; i++) {
printf(”%d “, list[i]);
}
printf(”\n”);
}
void swap(int *row, int *high)
{
int temp;
temp = *row;
*row = *high;
*high = temp;
}
void quick_sort(ELEMENT list[], int left, int right)
{
int q; // ํํฐ์
ํจ์์์ ๋ฐํ๋๋ ํผ๋ฒ ๊ฐ์ ์ ์ฅ
if (left < right) { // left๊ฐ right ์ ๋ง๋ ๋๊น์ง ์ ๊ท ํธ์ถ
q = partition(list, left, right); // partition ํจ์ ํธ์ถํด์ ํผ๋ฒ๊ธฐ์ค์ผ๋ก 2๊ฐ์ ๋ฆฌ์คํธ๋ก ๋ถํ
quick_sort(list, left, q-1); // left ๊ฐ์์ ํผ๋ฒ ๋ฐ๋ก ์ ๊ฐ๊น์ง ํธ์ถ
quick_sort(list, q+1, right); // ํผ๋ด ๋ฐ๋ก ๋ค์๋ถํฐ right๊น์ง ํธ์ถ
}
}
int partition(ELEMENT list[], int left, int right)
{
int pivot; // ํผ๋ฒ ๊ฐ์ ์ ์ฅํ ๋ณ์
int low, high; // low ๊ฐ๊ณผ high ๊ฐ์ ์ ์ฅํ ๋ณ์
low = left; // low๋ ์ผ์ชฝ์์๋ถํฐ
high = right + 1; // high ๋ ์ค๋ฅธ์ชฝ๋ถํฐ
pivot = list[left]; // ํผ๋ฒ์ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ์ฒ์ ๊ฐ์ ๊ฐ์ง๋ค
do { // low์ high๊ฐ ๋ง๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค
do {
low++; // list[low]๊ฐ์ด ํผ๋ฒ๋ณด๋ค ์์ผ๋ฉด low ๊ฐ์ ๊ณ์ ์ฆ๊ฐ์ํจ๋ค
}
while (low <= right && list[low] < pivot);
do {
high–; // list[high]๊ฐ์ด ํผ๋ฒ๋ณด๋ค ํฌ๋ฉด high ๊ฐ์ ๊ณ์ ๊ฐ์์ํจ๋ค
}
while (high >= left && list[high] > pivot);
if (low < high) swap (&list[low], &list[high]); // low๊ฐ high ๋ณด๋ค ์์๋ list[low]๊ฐ๊ณผ list[high]๊ฐ์ ๊ตํํ๋ค
display_list(list); // ์ค๊ฐ๊ณผ์ ์ถ๋ ฅ
}
while (low < high);
swap(&list[left], &list[high]); // ํผ๋ฒ์ ๋ฆฌ์คํธ์ ์ค์์ ์์น์ํจ๋ค
return high; // ํผ๋ฒ์ ์์น๋ฅผ ๋ฐํ
}
void main ()
{
ELEMENT list[MAX_LIST_SIZE];
int i;
printf(”๊ฐ์ ์
๋ ฅํด์ฃผ์ธ์\n”);
for (i = 0; i < MAX_LIST_SIZE; i++) {
printf(”%d ๋ฒ์งธ ๊ฐ : “, i+1);
scanf(”%d”, &list[i]);
}
display_list(list); // ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฆฌ์คํธ๋ฅผ ์ฐ์ ์ถ๋ ฅํ๋ค.
quick_sort(list, 0, MAX_LIST_SIZE-1); // ์
๋ ฅํ ๊ฐ์ ์ ๋ ฌ
}
[/spoiler]
์ด๋ฒ์ ์ด์ฐ์ํ ๊ณผ์ ๋ก ๋์จ ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ……
๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์์ ๊ฝค๋ ๋ง์ด ์ฐ์ธ๋ค๋๋ฐ……
(๋ฌผ๋ก ๋ค์ํ๊ฒ ์์ฉ ๊ฐ๋ฅ?!)

์ด๊ฒ ๊ฝค๋ ๋จธ๋ฆฌ๋ฅผ ์จ์ผ ๋ง๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ์
์ผ๋จ ์ดํด ํ๋ฉด์ ์ธ์ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ฝ๋ฉํ์๋ค.
์ํด ์ด๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ฃ์๋ง์ ๋ฐ๋ก ์งค์ ์๋ค๋ฉด ์ผ๋ง๋ ์ข์๊น?
์ ์ด์์ฌ ๋์๊ฒ ์ฒ์ฌ์ ์ฌ๋ฅ์ ์ ๋ฐ;;;;;
์์ธํ ์์ค๋ ๋ฐ์์ ๊ณ์~
[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
๊ธ ๋ถ๋ฅ :
ํ๋ก๊ทธ๋๋ฐ
ํ๊ทธ :
๊ณผ์ ,
๊ตฌ์กฐ,
๋น์ฉ,
์ํ,
ํธ๋ฆฌ,
์ ์ฅ,
์ด์ฐ,
์ด์ฐ์ํ,
์๋ฃ,
์๋ฃ๊ตฌ์กฐ,
์ต์,
์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ
๋จ๊น๋ง :
ํ๋๋ ์์ด์ฉ!.