1003 Emergency (25分)

在这里插入图片描述
在这里插入图片描述
第一问:第一种当到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]);
}```
题意:第一个是计算最短路径数,第二个是在计算最短路径中最多的营救人员数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值