作为一个城市的紧急救援队队长,你会得到一张你所在国家的特殊地图。 该地图显示了由一些道路连接的几个分散的城市。

地图上标出了每个城市的救援队伍数量以及任意两个城市之间每条道路的长度。 当其他城市接到紧急电话时,你的工作就是尽快带领你的人员赶到现场,同时在途中召集尽可能多的人手。

输入规格:

每个输入文件包含一个测试用例。 对于每个测试用例,第一行包含 4 个正整数:N (≤500) - 城市数量(城市编号从 0 到 N−1),M - 道路数量,C 1 和 C 2 - 分别是您当前所在的城市和必须救援的城市。 下一行包含N个整数,其中第i个整数是第i个城市的救援队数量。 接下来是M行,每行描述一条具有三个整数c 1 、c 2 和L的道路,这三个整数分别是由一条道路连接的一对城市和该道路的长度。 保证从C 1 到C 2 至少存在一条路径。

输出规格:

对于每个测试用例,在一行中打印两个数字:C 1 和 C 2 之间不同的最短路径的数量,以及您可能聚集的救援队的最大数量。 一行中的所有数字必须恰好由一个空格分隔,并且行尾不允许有多余的空格。

输入示例:

5 6 0 2

1 2 1 5 3

0 1 1

0 2 2

0 3 1

1 2 1

2 4 1

3 4 1

示例输出:

2 4

迪杰斯特拉主要思想就是: 每次选取距离源点最近的 不在源点这个集合 的点,并把该点加入源点这个集合,然后更新一下其他点到源点的最短距离,进行 n - 1次就行了

这里讲一下 cnt 和 num 数组

cnt 数组存储的是 从源点到达 点i的最短距离的总个数

num 数组存储的是 从源点到达 点i的最短距离前提下 所能聚集的救援队数量的最大值

解释一下为什么dist[t] + g[t][j] == dist[j]时, cnt[j] += cnt[t]; 如下图 假设源点是1,cnt[4] = 3,即有3条达到4的最短路,那么cnt[3] = cnt[3] + cnt[4] = 4

    #include <bits/stdc++.h>
using namespace std;
const int N = 510;
int g[N][N], dist[N], Peonum[N];
int cnt[N], num[N]; // 最短路的条数 和 最短路前提下最多能拉多少救援人员
bool st[N]; // 标记,选过的点不再选
int n, m, start, save; void djs()
{
memset(dist, 0x3f, sizeof dist); // 初始化
dist[start] = 0;
cnt[start] = 1;
num[start] = Peonum[start]; for (int i = 0; i < n; i ++)
{
int t = -1;
for (int j = 0; j < n; j ++)
if (!st[j] && (t == -1 || dist[j] < dist[t]))
t = j;
st[t] = true;
for (int j = 0; j < n; j ++)
{
if (dist[t] + g[t][j] < dist[j])
{
dist[j] = dist[t] + g[t][j];
cnt[j] = cnt[t];
num[j] = num[t] + Peonum[j];
}
else if (dist[t] + g[t][j] == dist[j])
{
cnt[j] += cnt[t];
num[j] = max(num[j], num[t] + Peonum[j]);
}
}
}
}
int main()
{
cin >> n >> m >> start >> save;
memset(g, 0x3f, sizeof g); // 初始化,最开始没有点是相连的 (0x3f是个很大的值)
for (int i = 0; i < n; i ++) cin >> Peonum[i];
for (int i = 0; i < m; i ++)
{
int a, b, c; cin >> a >> b >> c;
g[a][b] = g[b][a] = min(g[a][b], c);
}
djs();
cout << cnt[save] << ' ' << num[save] << endl;
return 0;
}

觉得写的不错的话,点个赞吧~

Dijkstra迪杰斯特拉求最短路和最短路的条数和各个点权值的最大值的更多相关文章

  1. Dijkstra(迪杰斯特拉求最短路径)-02-网络延迟时间

    有 N 个网络节点,标记为 1 到 N. 给定一个列表 times,表示信号经过有向边的传递时间. times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节 ...

  2. 最短路之Dijkstra(迪杰斯特拉)

    一般用法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代 ...

  3. Dijkstra(迪杰斯特拉)源最短路径 小白说明

    源最短路径 小白说明 Dijkstra算法,书上其实说的很简洁,仔细看,仔细思考是会理解的.但要先理解几条引论和推理. 而自己思考的思路在不需要任何推理只从贪心思路出发,和Dijkstra有所不同,但 ...

  4. 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)

    Dijkstra算法 ———————————最后更新时间:2011.9.25———————————Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径. ...

  5. 图解Dijkstra(迪杰斯特拉)算法+代码实现

    简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...

  6. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  7. (Dijkstra)迪杰斯特拉算法-最短路径算法

    迪杰斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想:设G=(V,E)是一个带权有向图 ...

  8. Dijkstra(迪杰斯特拉)算法求解最短路径

    过程 首先需要记录每个点到原点的距离,这个距离会在每一轮遍历的过程中刷新.每一个节点到原点的最短路径是其上一个节点(前驱节点)到原点的最短路径加上前驱节点到该节点的距离.以这个原则,经过N轮计算就能得 ...

  9. CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数

    题意: 给出n个点m条公路k条铁路. 接下来m行 u v w      //u->v 距离w 然后k行 v w         //1->v 距离w 如果修建了铁路并不影响两点的最短距离, ...

  10. hdu 1595 find the longest of the shortest(迪杰斯特拉,减去一条边,求最大最短路)

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

随机推荐

  1. Java SM2

    pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...

  2. verilog之function

    verilog之function 1.基本作用 function,就是声明一个函数.与task的区别就是有参数.function的返回值就是函数名(可以设置位宽),输入值任意,均作为输入参数.代码块需 ...

  3. Collation 差异导致 KingbaseES 与 Oracle 查询结果不同

    问题引入 前端提了个问题,说是KingbaseES 返回的结果与 Oracle 返回的结果不一样.具体问题如下: oracle 执行结果:oracle 有结果返回. SQL> create ta ...

  4. Linux内核数据管理利器--红黑树

    目录 写在前面 1. 红黑树的原理 2. 红黑树操作 2.1 红黑树的节点插入 2.2 红黑树的节点删除 2.3 红黑树的查询操作 3. 红黑树操作实验 附录A: 实验代码 写在前面 本文通过两个方面 ...

  5. 测试开发之系统篇-安装KVM虚拟机

    虚拟机(Virtual Machine)和容器(Container)是两种流行的虚拟化技术. 虚拟机模拟机器的硬件,包括了完整的操作系统和应用,它一旦被开启,预分配给它的资源将全部被占用.容器是运行在 ...

  6. 线上问题分析之java dump文件生成

    一.查看java进程 jps or ps aux | grep java 二.生成dump文件 jmap -dump:live,format=b,file=xxxx.bin 进程ID 三.查看dump ...

  7. 【WCH以太网接口系列芯片】STM32+CH390+Lwip协议栈简单应用测试

    本篇文章基于STM32F103和CH390H芯片进行例程移植及相关注意事项,简单验证TCP\UDP\Ping基础功能. 硬件:STM32F103开发板+沁恒CH390H的评估版图一示,SPI使用接口为 ...

  8. 使用OHOS SDK构建libxml2

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://gitlab.gnome.org/GNOME/ ...

  9. 兼容模式下导致数值类型发生隐式转换,SQL在生产上无法正常使用案例

    兼容模式下导致数值类型发生隐式转换,SQL 在生产上无法正常使用案例 本文出处:https://www.modb.pro/db/403148 基于 MogDB 版本 V2.0.1 问题现象 厂商研发描 ...

  10. 实例讲解昇腾 CANN YOLOV8 和 YOLOV9 适配

    本文分享自华为云社区<昇腾 CANN YOLOV8 和 YOLOV9 适配>,作者:jackwangcumt. 1 概述 华为昇腾 CANN YOLOV8 推理示例 C++样例 , 是基于 ...