언어/c언어

가중 그래프

파아랑새 2016. 4. 18. 20:12

/*
1  2  3  4  5
1 0  1  1  0  1
2 1  0  0  1  1
3 1  0  0  1  1
4 0  1  1  0  1
5 1  1  1  1  0
*/
#include <stdio.h>
#define ROW 5
#define COL 5
#define TRUE 1
#define AND &&
void sorting_function(int[][COL]);
int main(void) {
 int villige[5][5] = { 0, };
 int index_i, index_j;
 for (index_i = 0; index_i < ROW; index_i++) {
  for (index_j = index_i; index_j < COL; index_j++) {
   if (index_i == index_j) {
    villige[index_i][index_j] = 0;
   }
   else {
    printf("[%c][%c] villige[%d][%d] = ",
     (char)index_i + 65, (char)index_j + 65, index_i, index_j);
    scanf_s("%d", &villige[index_i][index_j]);
    villige[index_j][index_i] = villige[index_i][index_j];
   }
  }
 }
 /*
 //Echo printf
 for (index_i = 0; index_i < ROW; index_i++) {
  for (index_j = 0; index_j < COL; index_j++) {
   printf("%d ", villige[index_i][index_j]);
   if (index_j == COL - 1) {
    printf("\n");
   }
  }
 }
 */
 sorting_function(villige);
 return 0;
}
void sorting_function(int A_RRAY[][COL]) {
 int i, j, k; // index
 int index = 0;
 int road = 0;
 int result = 0;
 int vil_start = 0;
 int vil_stop = 0;
 int temp = 0;
 int i_; //일시적으로 col 을 담을 값
 // Echo printf
 for (i = 0; i < ROW; i++) {
  for (j = 0; j < COL; j++) {
   printf("%d ", A_RRAY[i][j]);
   if (j == COL - 1) {
    printf("\n");
   }
  }
 }
 printf("시작 마을 입력: ");
 scanf_s("%d", &vil_start);
 printf("도착 마을 입력: ");
 scanf_s("%d", &vil_stop);
 /*
 1  2  3  4  5
 1 0  0  1  0  1
 2 0  0  0  1  1
 3 1  0  0  1  1
 4 0  1  1  0  1
 5 1  1  1  1  0
 */

 //road 누적 값
 //index = 0
 if (A_RRAY[vil_start][vil_stop] != 0) {
  road += A_RRAY[vil_start][vil_stop];
 }
 else {
  //A_RRAY[vil_start][vil_stop] == 0
  /*
  이 경우는 출발 마을과 도착 마을이 바로 연결되지 않은 경우이다.
  출발 지점에서 시작하기로 한다.
  */
  k = vil_start;
  while (TRUE) {
   for (index = 0; index < 5; index++) {
    if (index == vil_stop) {
     if (A_RRAY[k][index] != 0) {
      road += A_RRAY[k][index];
      goto end_;
     }
    }
    else {// index != vil_stop
     if (temp == 0 AND A_RRAY[k][index] != 0) {
      result = A_RRAY[k][index]; //일시적으로 값을 담는다.
      temp = 1;
      i_ = index;
     }
     else if (temp != 0 AND A_RRAY[k][index] != 0) {
      if (result > A_RRAY[k][index]) {
       result = A_RRAY[k][index];
       i_ = index;
      }
     }
    }
   }
   A_RRAY[k][i_] = 0;
   k = i_; // ROW 값 교체
   road += result;
  }
 end_:;
 }
 printf("road %d\n", road);
}