zoukankan      html  css  js  c++  java
  • Dijkstra算法

    最近由于工作需要,需要研究最佳路径选择问题.估重新复习了遍dijkstra算法,以下做个记录

    代码
    #include "stdio.h"
    #include 
    <iostream.h>
    using namespace std; 
    #define BIG 65535 //无穷大

    //Dijkstra算法函数,求给定顶 点到其余各点的最短路径
    //参数:邻接矩阵、顶点数、出发点的下标、结果数组、路径前一点记录 
    void Dijkstra(int Cost[][5],int n,int v0,int Distance[],int prev[])
    {
        
    int s[5];
        
    int mindis,dis;
        
    int i,j,u;
        
    //初始化
        for(i=0;i<n;i++
        {
            Distance[i]
    =Cost[v0][i];
            s[i]
    =0;
            
    if(Distance[i]==BIG)
            prev[i] 
    = -1;
            
    else
            prev[i] 
    = v0;
        }
        Distance[v0] 
    = 0;
        s[v0] 
    =1//标记v0
        
    //在当前还未找到最短路径的顶点中,
        
    //寻找具有最短距离的顶点
        for(i=1;i<n;i++
        {
    //每循环一次,求得一个最短路径
            mindis=BIG;
            u 
    = v0;
            
    for (j=0;j<n;j++//求离出发点最近的顶点
            if(s[j]==0&&Distance[j]<mindis) 
            {
                mindis
    =Distance [j];
                u
    =j;
            } 
    // if语句体结束,j循环结束
            s[u] = 1;
            
    for(j=0;j<n;j++//修改递增路径序列(集合)
            if(s[j]==0&&Cost[u][j]<BIG) 
            { 
    //对还未求得最短路径的顶点
                
    //求出由最近的顶点 直达各顶点的距离
                dis=Distance[u] +Cost[u][j];
                
    // 如果新的路径更短,就替换掉原路径

                
    if(Distance[j]>dis)
                {
                    Distance[j] 
    = dis;
                    prev[j] 
    = u;
                }
            } 
    // if 语句体结束,j循环结束
        } // i循环结束
    }
    // 输出最短路径
    // 参数:路径前一点记录、出发点的下标、到达点下标、顶点数
    void PrintPrev(int prev[],int v0,int vn,int n)
    {
        
    int tmp = vn;
        
    int i = 1;
        
    //临时存路径 
        int *tmpprv = new int[n];
        
    //初始化数组 
        for(int ii=0;ii<n;ii++)
        tmpprv[ii] 
    = 0;

        
    //记录到达点下标 
        tmpprv[0= vn+1;
        
    //中间点用循环记录 
        for(int j=1;j<n;j++)
        {
            
    if(prev[tmp] != -1&&tmp != 0)
            {
                tmpprv[i] 
    = prev[tmp]+1;
                tmp 
    = prev[tmp];
                i
    ++;
            }
            
    else break;
        }

        
    //输出路径,数组逆向输出 
        for(int i=n-1;i>=0;i--)
        {
            
    if(tmpprv[i] !=0)
            { 
    //排除0元素 
                cout<<"\tV"<<tmpprv[i];
                
    if(i)  //不是最后一个输出符号 
                    cout << " --> ";
            }
        }
    }
    //主函数
    int main()
    {
        
    //给出有向网的顶点数组 
        char *Vertex[5]={"V1","V2","V3","V4","V5"};
        
    //给出有向网的邻接矩阵
        int Cost[5][5]={{0,10,BIG,30,100},
            {BIG,
    0,50,BIG,BIG},
            {BIG,BIG,
    0,BIG,10},
            {BIG,BIG,
    20,0,60},
            {BIG,BIG,BIG,BIG,
    0},
        };
        
    int Distance[5]; //存放求得的最短路径长度
        int prev[5];  //存放求得的最短路径
        
    //调用Dijkstra算法函数,求顶点V1到其余各点的最短路径
        
    //参数:邻接矩阵、顶点数、出发点的下标、 结果数组
        Dijkstra(Cost,5,0,Distance,prev);
        
    for(int i=0;i<5;i++)
        {
            
    //输出最短路径长度
            cout << Vertex[0<< "-->" << Vertex[i] << "\t" <<Distance[i];
            
    //输出最短路径
            PrintPrev(prev,0,i,5);
            cout 
    <<endl;
        }
        system(
    "pause");
        
    return 0;
    }
  • 相关阅读:
    【NOIP模拟】排序
    【NOIP模拟】企鹅矩阵
    【NOIP模拟】花花森林
    【BZOJ1045】糖果传递
    【BZOJ1271】秦腾的教学评估
    【POJ3714】Raid
    【TYVJ1424】占卜DIY
    【POJ3190】The Pilots Brothers' refrigerator
    【HDU1055】Color a Tree
    【NOIP2012】国王游戏
  • 原文地址:https://www.cnblogs.com/tqlin/p/1718683.html
Copyright © 2011-2022 走看看