Posts Tagged ‘์ž๋ฃŒ’

ํ€ต ์ •๋ ฌ

์ด๋ฒˆ์—๋Š” ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค

๋ฌผ๋ก  ์—ญ์‹œ ์ด์‚ฐ์ˆ˜ํ•™ ๊ณผ์ œ๋กœ ๋‚˜์˜จ ๋…€์„์ด๋‹ค

์ •๋ ฌ์€ ๋ญ๋‹ˆ๋ญ๋‹ˆํ•ด๋„ ๊ฐ„๋งŒํ•œ ๋ฒ„๋ธ”์ •๋ ฌ ๋งŒํ•œ๊ฒŒ ์—†๋‹ค๋Š”..?!;;;;;

์ž„์€๊ธฐ ๊ต์ˆ˜๋‹˜์ด ๋“ค์œผ๋ฉด ์‹ธ๋‹ฅ์…˜ ๋งž์„ ์†Œ๋ฆฌ๋ฅผ ๋œ๋œ;;

์ž์„ธํ•œ ์†Œ์Šค๋Š” ๋ฐ‘์—์„œ +_+ใ…‹

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