迪杰斯特拉算法基础篇见:https://blog.csdn.net/alex1997222/article/details/87113058
有的时候在图中,1个点到另一个点的最短路径不止一条,这时后会有除去距离外其他权重用于判断(比如花费,物资收集等)
这样的题型一般分为以下三种情况:
(1)给每条边再增加一个边权(比如花费),然后要求在多条最短路径上选择花费最少的那条
一般解决方式是,在算法运行时,如果一个结点的距离小于上一个结点的距离+边权,那么就照常赋值,但如果该节点距离==上一个结点的距离+边权,那么就比较花费
for (int v = 0; v < n; ++v) {
if (!Vis[v] && G[u][v] != INF) {
if(G[u][v] + d[u] < d[v]){
d[v] = G[u][v] + d[u]; //优化结点
c[v] = cost[u][v] + c[u];
}
else if(G[u][v] + d[u] == d[v] && c[v] > cost[u][v] + c[u]){
c[v] = cost[u][v] + c[u];
}
}
}
(2)给每个结点增加一个点权,要求在多条最短路上选择点权和最大的那条
思路与上个案例一致,我们用一个数组保存各个点的点权
for (int v = 0; v < n; ++v) {
if (!Vis[v] && G[u][v] != INF) {
if(G[u][v] + d[u] < d[v]){
d[v] = G[u][v] + d[u]; //优化结点
w[v] = weight[v] + w[u];
}
else if(G[u][v] + d[u] == d[v] && w[v] < weight[v] + w[u]){
w[v] = weight[v] + w[u];
}
}
}
(3)求最短路径的条数
一样的思路:赋值更优方案时,把上一个结点的路径条数赋到这个结点中
for (int v = 0; v < n; ++v) {
if (!Vis[v] && G[u][v] != INF) {
if(G[u][v] + d[u] < d[v]){
d[v] = G[u][v] + d[u]; //优化结点
num[v] = num[u];
}
else if(G[u][v] + d[u] == d[v]){
num[v] += num[u];
}
}
}
上述权重数组c[x],w[x],num[x],要和d[x]一样,起点位置要进行初始化