zoukankan      html  css  js  c++  java
  • dijkstra算法求最短路

    艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人。 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学。曾在1972年获得过素有计算机科学界的诺贝尔奖之称的图灵奖,之 后,他还获得过1974年 AFIPS Harry Goode Memorial Award、1989年ACM SIGCSE计算机科学教育教学杰出贡献奖、以及2002年ACM PODC最具影响力论文奖。

    艾兹格·W·迪科斯彻(Edsger Wybe Dijkstra)

    1 提出“goto有害论”;
    2 提出信号量和PV原语;
    3 解决了“哲学家聚餐”问题;
    4 最短路径算法(SPF)和银行家算法的创造者;
    5 第一个Algol 60编译器的设计者和实现者;
    6 THE操作系统的设计者和开发者;
    与D. E. Knuth并称为我们这个时代最伟大的计算机科学家的人。
    与癌症抗争多年,于2002年8月6日在荷兰Nuenen自己的家中去世,享年72岁。
     

    Dijkstra算法C代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define  MAXINT  32767
    #define  MAXNUM  6
    
    char *str = "ABCDEF";
    void dijkstra(int *dist, int *prev, int (*A)[MAXNUM], int v0);
    void findPath(int *dist, int *prev, int start, int end);
    
    int main()
    {
    
        
        int A[MAXNUM][MAXNUM] = {{0, 6, 3, MAXINT, MAXINT, MAXINT}, 
                                 {6, 0, 2, 5,      MAXINT, MAXINT},
                                 {3, 2, 0, 3,      4,      MAXINT},
                                 {MAXINT, 5, 3, 0, 2,           3},
                                 {MAXINT, MAXINT, 4, 2, 0,      5},
                                 {MAXINT, MAXINT, MAXINT, 3, 5, 0},
                                };
        int dist[MAXNUM] = {0};
        int prev[MAXNUM] = {0};
        int v0 = 2, i = 0;
        
        dijkstra(dist, prev, A, v0);
        
        findPath(dist, prev, v0, 5);
        
        //for(i = 0; i < MAXNUM; i++)
        {
        //    printf("%d ", prev[i]);
        }
            
        system("pause");
        return 0;
    }
    
    void findPath(int *dist, int *prev, int start, int end)
    {
        int tmp = prev[end];
        int *rst = (int*)calloc(MAXNUM, sizeof(int));
        int cnt = 0, i = 0;
        rst[cnt] = end;
        cnt++; 
        if(tmp == start)
        {
            rst[cnt] = tmp;
        }
        else
        {
            while(tmp != start)
            {   
                rst[cnt] = tmp;
                tmp = prev[tmp];
                cnt++;    
            }
            rst[cnt] = tmp;
        }
        
        //printf("%d
    ", cnt);
        for(i = cnt; i >= 0; i--)
        {
            printf("%c", str[rst[i]]);
            if(i != 0)
            {
                printf("->");
            }
        }
        printf("  %d
    ", dist[end]);
        
        free(rst);
        rst = NULL;
            
    }
    
    void dijkstra(int *dist, int *prev, int (*A)[MAXNUM], int v0)
    {
        int S[MAXNUM];
        int n = MAXNUM, i = 0, j = 0;
        for (i = 0; i < n; i++)
        {
            dist[i] = A[v0][i];
            S[i] = 0;
            if(dist[i] == MAXINT)
            {
                prev[i] = -1;
            }
            else
            {
                prev[i] = v0;
               // printf("%c前驱%c
    ", str[i], str[v0]);
            }
        }
        dist[v0] = 0;
        S[v0] = 1;
        
        for(i = 1; i < n; i++)
        {
            int mindist = MAXINT;
            int u = v0;
            for(j = 0; j < n; j++)
            {
                if((!S[j]) && dist[j] < mindist)
                {
                    u = j;
                    mindist = dist[j];
                } 
            }
            S[u] = 1;
            
            for(j = 0; j < n; j++)
            {
                if((!S[j]) && A[u][j] < MAXINT)
                {
                    if(dist[u] + A[u][j] < dist[j])
                    {
                        dist[j] = dist[u] + A[u][j];
                        prev[j] = u;
                       // printf("%c前驱%c
    ", str[j], str[u]);
                    }
                }
            }
        }
    }
    View Code

    代码仅供参考

    参考资料

    1. 百度百科   http://baike.baidu.com/link?url=LWr-IQcqdJoG9qAz_kmQ6kIybBDqEqj0bo3dk-t3A_vtd0P_Ee1EvCWm3iQokRWmregR_vLSt7zgB_wSVqvCaq
    2. 最短路径—Dijkstra算法和Floyd算法   http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html
  • 相关阅读:
    第12课
    第11课
    第6课
    第5课
    ubuntu apache 通过端口新建多个站点
    phpstudy所需运行库
    ubuntu 修改和配置ip
    Linux Cp命令
    Ubuntu各个版本的镜像下载地址
    ubuntu 虚拟机添加多个站点
  • 原文地址:https://www.cnblogs.com/hdu-2010/p/4672360.html
Copyright © 2011-2022 走看看