zoukankan      html  css  js  c++  java
  • Dijkstra最短路径算法实例

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

    /* Dijkstra算法 */

    #define VNUM 5
    #define MV 65536

    int P[VNUM]; //保存最短路径
    int Dist[VNUM];
    int Mark[VNUM];
    int Matrix[VNUM][VNUM] =
    {
        {0, 10, MV, 30, 100},
        {MV, 0, 50, MV, MV},
        {MV, MV, 0, MV, 10},
        {MV, MV, 20, 0, 60},
        {MV, MV, MV, MV, 0},
    };

    void Dijkstra(int sv) // O(n*n)
    {
        int i = 0;
        int j = 0;
        //每个订点进行标识
        if( (0 <= sv) && (sv < VNUM) )
        {
            for(i=0; i<VNUM; i++)
            {
                Dist[i] = Matrix[sv][i];
                P[i] = sv;  //路径之前
                Mark[i] = 0;
            }
            
            Mark[sv] = 1;
            //寻找最短路径
            for(i=0; i<VNUM; i++)
            {
                int min = MV;
                int index = -1;
                
                for(j=0; j<VNUM; j++)
                {
                //寻找的订点不能被标记
                    if( !Mark[j] && (Dist[j] < min) )
                    {
                        min = Dist[j];
                        index = j;
                    }
                }
              
                if( index > -1 )
                {
                    Mark[index] = 1;
                }
                  //更新数组  
                for(j=0; j<VNUM; j++)
                {
                    if( !Mark[j] && (min + Matrix[index][j] < Dist[j]) )
                    {
                        Dist[j] = min + Matrix[index][j];
                        P[j] = index;
                    }
                }
            }
            //打印每次遍历的最短路径
            for(i=0; i<VNUM; i++)
            {
                int p = i;
                
                printf("%d -> %d: %d ", sv, p, Dist[p]);
                
                do
                {
                    printf("%d <- ", p);
                    p = P[p];
                } while( p != sv );
                
                printf("%d ", p);
            }
        }
    }

    int main(int argc, char *argv[])
    {
           Dijkstra(0);

        return 0;
    }

  • 相关阅读:
    greybox关闭/刷新父窗口
    C# 获取文件编码
    框架页,URL中文参数乱码
    用来代替SQLSERVERAGENT的VBS脚本。
    jQuery的radio,checkbox,select操作
    mssql 的sp_help好难看
    如何判断网通、电信、铁通IP地址分配段
    IE8取不到 select 的option值
    如何识别当前的 SQL Server 版本号以及对应的产品级别
    控诉我的电脑
  • 原文地址:https://www.cnblogs.com/wxb20/p/6178131.html
Copyright © 2011-2022 走看看