μ΄λ²μλ ν΅ μ λ ¬ μκ³ λ¦¬μ¦μ΄λ€
λ¬Όλ‘ μμ μ΄μ°μν κ³Όμ λ‘ λμ¨ λ
μμ΄λ€
μ λ ¬μ λλλλν΄λ κ°λ§ν λ²λΈμ λ ¬ λ§νκ² μλ€λ..?!;;;;;
μμκΈ° κ΅μλμ΄ λ€μΌλ©΄ μΈλ₯μ
λ§μ μ리λ₯Ό λλ;;

μμΈν μμ€λ λ°μμ +_+γ
[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
κΈ λΆλ₯ :
νλ‘κ·Έλλ°
νκ·Έ :
κ³Όμ ,
ꡬ쑰,
λΉμ©,
μν,
νΈλ¦¬,
μ μ₯,
μ΄μ°,
μ΄μ°μν,
μλ£,
μλ£κ΅¬μ‘°,
μ΅μ,
μ΅μ λΉμ© μ μ₯ νΈλ¦¬
λ¨κΉλ§ :
νλλ μμ΄μ©!.