Posts Tagged ‘ํŠธ๋ฆฌ’

๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜๋Š” ํฌ๋ฆฌ์Šค๋งˆ์Šค ํŒŒํ‹ฐ ์ค€๋น„

์– ๋ถธ๋ถธ

 

ํฌ๋ฆฌ์Šค๋งˆํŠธ ํŠธ๋ฆฌ ์žฅ์‹์„ ์ž…์ˆ˜ํ–ˆ๋‹ค๋Š”

๋‚˜๋จธ์ง€ ์žฅ์‹์€ ๊ทธ๋ƒฅ ๋Œ€์ถฉ ์ค€๋น„๋ฅผ ํ•ด๋†“๊ณ 

 

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‚˜๋ฌด๋ฅผ

-_-โ€ฆโ€ฆ.๋ฒŒ๋ชฉํ•ด์•ผ ๋  ํŒ์ด๋ผ๋Š”

P091123002 

ํ›„ํ›„ํ›„โ€ฆโ€ฆ ์ „์› ๋„ฃ์–ด๋ณด๋‹ˆ๊นŒ ๋ถˆ์ด ์ž˜ ๋“ค์–ด์˜จ๋‹ค๋Š” +_+

P091123001

๋‹ค์–‘ํ•œ ๋ชจ๋“œ๋กœ ๋ถˆ ์ผค ์ˆ˜๊ฐ€ ์žˆ๊ฒŒ ๋˜์–ด์žˆ๋Š”๋ฐ

์ด๊ฑฐ ์ž˜๋งŒํ•˜๋ฉด ๊ฝค๋‚˜ ์žฌ๋ฏธ์žˆ๊ฒŒ ์จ๋จน์„ ์ˆ˜ ์žˆ๊ฒ ๋‹ค ใ…‹ใ…‹ใ…‹ +_+ ์•ผํ˜ธ~~

๊ฒŒ์‹œ ๋‚ ์งœ : 11์›” 27th, 2009
๊ธ€ ๋ถ„๋ฅ˜ : ์ผ์ƒ
ํƒœ๊ทธ : , , ,
๋‚จ๊น€๋ง : 2 ๊ฐœ ์žˆ๋„ค์š”?!O_o.

์ตœ์†Œ ๋น„์šฉ ์‹ ์žฅ ํŠธ๋ฆฌ

์ด๋ฒˆ์— ์ด์‚ฐ์ˆ˜ํ•™ ๊ณผ์ œ๋กœ ๋‚˜์˜จ ์ตœ์†Œ ๋น„์šฉ ์‹ ์žฅ ํŠธ๋ฆฌ……

๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ฝค๋‚˜ ๋งŽ์ด ์“ฐ์ธ๋‹ค๋Š”๋ฐ……

(๋ฌผ๋ก  ๋‹ค์–‘ํ•˜๊ฒŒ ์‘์šฉ ๊ฐ€๋Šฅ?!)

์ด๊ฒŒ ๊ฝค๋‚˜ ๋จธ๋ฆฌ๋ฅผ ์จ์•ผ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ์„œ

์ผ๋‹จ ์ดํ•ด ํ•˜๋ฉด์„œ ์™ธ์šฐ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ฝ”๋”ฉํ•˜์˜€๋‹ค.

์—ํœด ์ด๋Ÿฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋“ฃ์ž๋งˆ์ž ๋ฐ”๋กœ ์งค์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ์ข‹์„๊นŒ?

์‹ ์ด์‹œ์—ฌ ๋‚˜์—๊ฒŒ ์ฒœ์žฌ์  ์žฌ๋Šฅ์„ ์ œ๋ฐœ;;;;;

์ž์„ธํ•œ ์†Œ์Šค๋Š” ๋ฐ‘์—์„œ ๊ณ„์†~

[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]