前言:上一篇博客讲解了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种出题方法的结合,但是思路都是一样的。