dijkstra应用项目实例:求边上小站点之间的最短距离

代码,测试数据会放一个链接,vs2019直接.sln加载即可

项目介绍

给出各个节点之间的距离,邻接矩阵或者邻接表
给出关于站的描述:n1,lc1,n2,lc2,name
代表name站距n1lc1公里,距n2lc2公里
若lc1,lc2,n2都等于0,则说明这个站在n1节点上
若n2<0,则说明这个站在节点n1的尽头线上
求两个站之间的最短距离
图形描述大概就是这样:
dijkstra应用项目实例:求边上小站点之间的最短距离_第1张图片
求红色圆圈的最短路,并要求以站名输出路径。

程序设计

这里采用按节点建图,边存站点的方法。
边需要存储的信息:边的起点,边的终点,边上的站点
或许边的起点不需要存,可以优化掉,日后有机会再优化吧,下面的算法用到了边的起点

struct EDG
{
    int from, to, len;
    vector<dta> sta;
    bool operator <(const EDG& x)const
    {
        return len > x.len;
    }
};

重载小于号,用Dijkstra+优先队列的算法求最短路。
无向图,双向存边。
有两种特殊边
-一种是站点在节点上,用一个指向自己的边,长度为0的边存即可
-一种是站点在节点的尽头线上,用一个指向负数,边长无现长的边存储即可
站点只需要任意一条单向边就行了

因为求解得是站点之间的路径,所以用一个

map<string,int> loc;

记录站点所在的边的边号,采用链式前向*的存法,直接记录在edg集中的位置就好了

开始dijkstra

通过映射loc我们可以得到两个站点所在的边,称为为起点边和目标边

对起点边的终点,目标边的起点求最短距离即可;

两个站点之间的最短路,有两小部分是基本固定的,就是起点边的部分和终点边的部分,去掉这两部分,求最短路,最后再加上这两部分的长度就是最短路了。

如果起始站点在尽头线上,那么刚开始进入优先队列的边应该是起始边的起点(因为这时起始边的终点是个负数,用起点是一样的),否则进入优先队列的就是起始边的终点。

起点边终点边很简单的特判一下,算法描述基本就是这样了。

你可能感兴趣的:(dijkstra)