• 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;
    }

  • 相关阅读:
    网络基础
    Linux安装Redis
    mongodb——文档操作
    mangodb——集合的操作
    Linux安装MongoDB
    2021-10-14软件设计师
    2021-10-13
    How do you use System.Drawing in .NET Core?
    C# 9.0 新特性
    Mysql存储引擎
  • 原文地址:https://www.cnblogs.com/wxb20/p/6178131.html
Copyright © 2020-2023  润新知