第一问:第一种当到m的最短路径加上m到j的路径小于到j的路径时,那么到j的最短路径就更新为到m的最短路径。
第二种情况:如果当m的最短路径加上m到j的路径等于到j的路径时,那么到j的最短路径就更新到m的最短路径加上之前到j的最短路径的数目。
图中:1\2\3\是到m的当前最短路径,4、5是当前到j的最短路径;
第二问:当m点加上到j的距离小于当前到j的最小距离时,那权重就自动更新为m点的权重加上m点到j的权重;
当相等的时候,就要比较当前大j的权重4,5和1,2,3,加上m点到j的权重的大小,取最大的。
在这里插入代码片
#include <cstdio>
#include <vector>
using namespace std;
const int inf = 10000001;
int adj[501][501] = {0};
bool flag[501] = {false};
int d[501];
int r[501];
int N,M,C1,C2;
int rode[501];
int max_rode[501];
int temp;
void Shortest_Path_DJC(){
d[C1] = 0; //首先起点到起点的距离为0;
for(int i = 0; i < N; i++){
int m = -1,min = inf;
for(int j = 0; j < N; j++) {
if (flag[j] == false && d[j] < min) {
m = j;
min = d[j];
}
}
if(m == -1) return;
flag[m] = true;
for(int j = 0; j < N; j++){
if(flag[j] == false && adj[m][j] != 0 && d[m] + adj[m][j] < d[j]){
d[j] = d[m] + adj[m][j];
max_rode[j] = max_rode[m] + r[j];
rode[j] = rode[m];
}
else if(flag[j] == false && adj[m][j] != 0 && d[m] + adj[m][j] == d[j])
{
d[j] = d[m] + adj[m][j];
rode[j] = rode[j] +rode[m];
max_rode[j] = max_rode[j] > (max_rode[m] + r[j]) ? max_rode[j] : (max_rode[m] + r[j]);
}
}
}
}
int main(){
int a,b,c;
fill(d,d+501,inf);
fill(rode,rode+501,0);
fill(max_rode,max_rode+501,0);
scanf("%d %d %d %d",&N,&M,&C1,&C2);
for(int i = 0; i < N; i++){
scanf("%d",&r[i]);
}
for(int i = 0; i < M; i++){
scanf("%d %d %d",&a,&b,&c);
adj[a][b] = c;
adj[b][a] = c;
}
max_rode[C1] = r[C1];
rode[C1] = 1;
Shortest_Path_DJC();
printf("%d %d\n",rode[C2],max_rode[C2]);
}```
题意:第一个是计算最短路径数,第二个是在计算最短路径中最多的营救人员数。