算法——最短路径的应用

      前言:上一篇博客讲解了dijkstra的基本思想以及实现方法,但是真正在比赛的题目中不会直接给你一个摸板题让你套模板的。更多的时候会出现不只一条最短路径,这个时候该怎么办呢?碰到这种情况的时候一般都会有第二标尺,在所有的最短路径中依据第二标尺选择一条最优路径,一般有以下3中出题方式:

1、给每条边再增加一个边权(比如花费),要求在所有最短路径中找到一条花费之和最小的路径。(这里还要看增加的边权具体是什么含义和题目中的具体要求)

      初始化时只有c[s]为0,其余均为inf

for(int v=0;v<n;v++)
{
    if(vis[v]==false&&G[u][v]!=inf)
    {
        if(d[u]+G[u][v]<d[v])
                                //当最短距离可优化时更新最短距离和花费两个变量,当最短距离相等                           
        {                        //时只更新花费变量
            d[v]=d[u]+G[u][v];
            c[v]=c[u]+cost[u][v];
        }
        else if(d[u]+G[u][v]==d[v]&&c[u]+cost[u][v]<c[v])
        {
            c[v]=c[u]+cost[u][v];
        }
    }
}

 2、给每个点增加一个点权(例如每个城市能收集到的物资),在最短路径有多条时求出点权之和最大或者最小的最短路径。

      对w[]数组初始化时只有w[s]为weight[s],其余均为0.

for(int v=0;v<n;v++)
{
    if(vis[v]==false&&G[u][v]!=inf)
    {
        if(d[u]+G[u][v]<d[v])
                                //当最短距离可优化时更新最短距离和物资两个变量,当最短距离相等                           
        {                        //时只更新物资变量
            d[v]=d[u]+G[u][v];
            w[v]=w[u]+weight[u][v];
        }
        else if(d[u]+G[u][v]==d[v]&& w[u]+weight[v]<w[v])
        {
            w[v]=w[u]+weight[u][v];//最短距离相同时看是否能使w[v]更优
        }
    }
}

 

3、直接问有多少条最短路径

      对num[]数组初始化时只能有num[s]为1,其余的均为0.

for(int v=0;v<n;v++)
{
    if(vis[v]==false&&G[u][v]!=inf)
    {
        if(d[u]+G[u][v]<d[v])
                                                           
        {                        
            d[v]=d[u]+G[u][v];
            num[v]=num[u];//最短距离不同时,num[v]继承num【u]
        }
        else if(d[u]+G[u][v]==d[v])
        {
            num[v]+=num[u];//否则相加
        }
    }
}

题目中有时候是这3种出题方法的结合,但是思路都是一样的。

    原文作者:算法
    原文地址: https://www.twblogs.net/a/5bde1ea02b717720b51b650f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞