• 最短路径算法之Dijkstra算法


    参考:《大话数据结构》

    这是一个按照路径长度递增的次序产生最短路径的算法。它并不是一次求出源点到目标点的最短路径,而是一步步求出它们之间顶点的最短路径,过程中都是基于已经求出的最短路径的基础上,求得更远顶点的最短路径,最终得到想要的结果。

    #define MAXVEX 9
    #define INFINITY 
    typedef int PathMatrix[MAXVEX]
    typedef int ShortPathTable[MAXVEX]
    
    void ShortestPath_Dijkstra(MGraph G, int v0, PathMatrix *p, ShortPathTable *D)
    {
        int v,w,k,min;
        int final[MAXVEX]; //final[w]=1表示求得顶点v0到vw的最短路径
        for(v=0;v<G.numVertexes;v++)
        {
            final[v] = 0; //全部顶点初始化为未知最短路径状态
            (*D)[v] = G.matrix[v0][v]; //将与v0点有连线的顶点加上权值
            (*p)[v] = 0; //初始化路径数组p为0
        }
        (*D)[v0] = 0; //v0至v0路径为0
        final[v0] = 1; //v0至v0不需要求路径
        /*开始主循环,每次求得v0到某个v顶点的最短路径*/
        for(v=1;v<G.numVertexes;v++)
        {
            min = INFINITY;
            for(w=0;w<G.numVertexes;w++) //寻找离v0最近的顶点
            {
                if(!final[w] && (*D)[w] < min)
                {
                    k = w;
                    min = (*D)[w];
                }
            }
        }
        final[k] = 1; //将目前找到的最近的顶点置为1
        for(w=0;w<G.numVertexes;w++)
        {
            if(!final[w] && (min + G.matrix[k][w])<(*D)[w]) //如果警告v顶点的路径比现在这条路径的长度短的话
            {
                (*D)[w] = min + G.matrix[k][w];
                (*p)[w] = k;
            }
        }    
    }
  • 相关阅读:
    HTML标签语义化对照表
    C#自定义分页控件3.0
    并发小工具
    C#方法
    我所知道的一个简单类
    等快递无聊旋转字符串
    委托
    撒列实现关键字过滤,速度可快了
    垃圾回收代
    递归再一次让哥震惊了
  • 原文地址:https://www.cnblogs.com/144823836yj/p/9039176.html
Copyright © 2020-2023  润新知