zoukankan      html  css  js  c++  java
  • Dijsktra算法C++实现

    Dijsktra算法解决了有向图G=(V,E)上带权的单源最短路径问题。但要求所有边的权值非负。

    思想:Dijkstra算法中设置了一顶点集合S,从源点s到集合中的顶点的最终最短路径的权值均已确定。算法反复选择具有最短路径估计的顶点u€V-S,并将u加入S中,对u的所有出边进行松弛。

     /*==================================================*
     | Dijkstra 数组实现O (N^2 )
    | Dijkstra --- 数组实现( 在此基础上可直接改为STL 的Queue实现)
     | lowcost[] --- beg 到其他点的最近距离
    | path[] -- beg为根展开的树,记录父亲结点
    *==================================================*/
    #define INF 0x3F3F3F3F;
    const int N=210;
    int path[N],vis[N];
    void Dijkstra(intcost[][N],int lowcost[N],int n,int beg)
    {
        int i,j,min;
        memset(vis,0,sizeof(vis));
        vis[beg]=1;
        for(i=0; i<n; i++)
        {
            lowcost[i]=cost[beg][i];
            path[i]=beg;
        }
        lowcost[beg]=0;
        path[beg]=-1;
        int pre=beg;
        for(i=1; i<n; i++)
        {
            min=INF;
            for(j=0; j<n; j++)
                //下面的加法可能导致溢出,INF不能取太大
                if(vis[j]==0&&lowcost[pre]+cost[pre][j]<lowcost[j])
                {
                    lowcost[j]=lowcost[pre]+cost[pre][j];
                    path[j]=pre;
                }
            for(j=0; j<n; j++)
                if(vis[j]==0&&lowcost[j]<min)
                {
                    min=lowcost[j];
                    pre=j;
                }
            vis[pre]=1;
        }
    }
  • 相关阅读:
    为什么你需要升级 pip
    将py文件封装为exe
    Kafka原理分析之基础篇
    顶象验证码破解与研究
    优秀学员学习总结分享(三)
    优秀学员学习总结分享(二)
    ES6数组的扩展--Array.from()和Array.of()
    ES6核心特性
    优秀学员学习总结分享(一)
    JavaScript常见的六种继承方式
  • 原文地址:https://www.cnblogs.com/panweishadow/p/3396001.html
Copyright © 2011-2022 走看看