티스토리 뷰

주어진 알고리즘을 c로 구현한 것입니다.

어디까지나 구현에 목적을 두었으므로 최적화된 코드가 아님을 알려드립니다..


// 최단경로 Dijkstra Algorithm을 이용한 해법

#include <stdio.h>
#include <stdlib.h>

#define n 6 // 정점이 몇개인지를 정의
#define m 9999 // 연결되지 않은 정점끼리는 9999라는 값으로 끊어졌음을 표시..

int flag[n+1],dist[n+1]; // 거리 결정난곳 체크 배열과 거리 배열
int i,j,min,bk; // i,j는 for문 돌릴때 쓰는거 min은 최소값 갱신시 사용,bk는 위치 백업
int data[n+1][n+1] = {
 {0,0,0,0,0,0,0},
       {0,0,2,m,3,m,m},
       {0,m,0,4,1,m,m},
       {0,m,m,0,4,1,3},
       {0,m,2,2,0,1,m},
       {0,m,m,1,m,0,6},
       {0,m,m,m,m,m,0}};  // 기본적으론 파일로 입력 받아야 겠지만.. 예제이므로 이렇게 입력. 인접행렬방법으로 그래프를 배열에 입력...


void main()
{
  for (i=1;i<=n;i++) {  // 초기화 부분
     flag[i] = 0;
     dist[i] = 9999;
  }
  dist[1] = 0;  // 1번점부터 어떤점까지를 이 소스에선 구할꺼라서 1부터 0으로 초기화 하고 시작합니다.
  for (i=1;i<=n;i++) {
     min = 32767;  // 일단 무한대(걍 큰수)로 초기화 하고
     for (j=1;j<=n;j++) {
        if (min>dist[i] && flag[j]==0) {  //dist[i]의 값이 for j 돌리면서 구한 최소값보다 작으면 그리고 아직 결정나지 않은 정점이라면
           min = dist[i]+data[i][j];  // 갱신합니다
           bk = j;  // 현재 위치 백업
        }
     }
     flag[bk] = 1;  // 현재 위치(정점)은 최소값으로 결정되었으니 1로 막아놓음..
     for (j=1;j<=n;j++) {
        if (dist[j] > data[bk][j]+dist[bk] && data[bk][j] != m)
// 현재 위치에서의 j 위치로 가는데까지의 값보다 이때까지 구한 j까지의 거리가 더 크면  그리고 해당 부분이 끊어지지 않았다면
        {
           dist[j] = data[bk][j] + dist[bk];  // 거리 배열을 갱신합니다
        }
     }
  }

  for (i=1;i<=n;i++) {
   printf("1 ~ %d : %d\n",i,dist[i]); // 1부터 각각의 점까지의 거리의 최소 값을 출력
  }

}






본 자료는 다른곳에서 스크랩한 자료 입니다.

출처를 아신분은 댓글로 달아주세요

'기억하자정보 > 알고리즘' 카테고리의 다른 글

A-star algorithm  (0) 2006.12.26
최단경로알고리즘 구현  (0) 2006.12.07
최단경로 알고리즘 C++로 작성  (0) 2006.12.07
최단거리 알고리즘 참고 사이트  (0) 2006.12.07
최단경로 알고리즘  (0) 2006.12.07
댓글
안내
궁금한 점을 댓글로 남겨주시면 답변해 드립니다.