데이크스트라 알고리즘(Dijkstra algorithm)

소스코드

 
#define M    65535
#define MAX    10

int path_info[MAX][MAX]={     
     { 0, 1, 4, 2, 9, M, M, M, M, 3},     //a    0
     { 1, 0, M, M, 7, M, M, 5, M, M},     //b    1
     { 4, M, 0,11, M, M, 4, M, M, M},     //c    2
     { 2, M,11, 0, M, 1, M, M, M, M},     //d    3
     { 9, 7, M, M, 0, 2, M, 1, M, 3},     //e    4
     { M, M, M, 1, 2, 0, 2, M, 5, 4},     //f    5
     { M, M, 4, M, M, 2, 0, M, 7, M},     //g    6
     { M, 5, M, M, 1, M, M, 0, M, 2},     //h    7
     { M, M, M, M, M, 5, 7, M, 0, 3},     //i    8
     { 3, M, M, M, 3, 4, M, 2, 3, 0}      //j    9
    };

int dijkstra(char start, char end){
    int di   [MAX]={M, M, M, M, M, M, M, M, M, M};
    int chk  [MAX]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    int pre  [MAX]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    if(start < 'a' || start > 'j') return -1;
    if(end   < 'a' || end   > 'j') return -1;

    int start_idx = start-'a';
    int end_idx   = end  -'a';
    int idx = 0;
    /*최단거리 탐색*/
    di[start_idx] = 0;
    for(int i=0; i<MAX; i++){
        unsigned int min = M;
        for(int j=0; j<MAX; j++){
            if( (chk[j]==0) && (di[j] < min)){
                idx= j;
                min= di[j];
            }
        }
        chk[idx]=1;
        if(min==M){
            return -1;
        }
        for(int j=0; j<MAX; j++){
            if( di [j] > di[idx]+path_info[idx][j]){
                di [j] = di[idx]+path_info[idx][j];
                pre[j] = idx;
            }
        }
        if(idx==end_idx){
            break;
        }
    }
    //최단거리 탐색

    //탐색 경로 출력
    int pre_idx;
    int top;
    int pre_path[MAX]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    for(int i=0; i<MAX; i++){
        pre_idx = i;
        top = 0;
        if(pre_idx!=start_idx){
            if(chk[i]>0){
                do{
                    pre_path[top++] = pre_idx;
                    pre_idx            = pre[pre_idx];
                }while(pre_idx!=start_idx);

                pre_path[top]=pre_idx;
                while(top >= 0){
                    printf("%c[%d]", pre_path[top]+'a', pre_path[top]);
                    if(top--!=0){
                        printf("->");
                    }
                }
                printf("\n");
            }
        }
    }
    //탐색 경로 출력

    printf("\n %c=>%c :%d", start, end, di[end_idx]);
    return 0;
}

참고사이트

2008/12/29 13:08 2008/12/29 13:08
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

GCC virtual method 컴파일 문제

class a{
public:
    a(){}
    ~a(){}
    virtual void test() = 0;
}

class b : public a{
    virtual void test(){printf("test");}
}

위와 같이 선어후 컴파일 할경우 GCC에서
warning: ‘class a’ has virtual functions but non-virtual destructor
와 같은 경고 메세지를 출력한다.

class a의 소멸자에 virtual을 붙여주자

class a{
public:
    a(){}
    virtual ~a(){}
    virtual void test() = 0;
}

class b : public a{
    virtual void test(){printf("test");}
}

2008/12/03 18:41 2008/12/03 18:41
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

uname

이름
    uname - 현재 커널에 관한 이름과 정보를 얻어온다.

사용법
    #include <sys/utsname.h>
    int uname(struct utsname *buf);

설명
    uname은 buf가가리키는 구조체에 시스템 정보를 리턴한다.  utsname 구조체는 다음과 같다. 
    <sys/utsname.h>:
    struct utsname {
                char sysname[SYS_NMLN];
                char nodename[SYS_NMLN];
                char release[SYS_NMLN];
                char version[SYS_NMLN];
                char machine[SYS_NMLN];
          #ifdef _GNU_SOURCE
                char domainname[SYS_NMLN];
          #endif
    };

반환값
    성공시, 0이 리턴된다. 에러시, -1이 리턴되며 errno가적절한 값으로 설정된다.

에러
    EFAULT buf가유효하지 않다.

호환
    SVr4, SVID, POSIX, X/OPEN
    domainname 변수는 GNU 확장이다.

관련 항목
    uname(1), getdomainname(2), gethostname(2)

셈플 소스

  struct utsname buf;
  uname(&buf);

  printf("sysname    %s\n", buf.sysname   );
  printf("nodename   %s\n", buf.nodename  );
  printf("release    %s\n", buf.release   );
  printf("version    %s\n", buf.version   );
  printf("machine    %s\n", buf.machine   );
  printf("domainname %s\n", buf.domainname);

출력 결과

    sysname    Linux
    nodename   redjini.com
    release    2.6.18-8.el5
    version    #1 SMP Thu Mar 15 19:57:35 EDT 2007
    machine    i686
    domainname (none)
2008/12/01 15:03 2008/12/01 15:03
태그 : ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다