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

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

输入规格:

每个输入文件包含一个测试用例。 对于每个测试用例,第一行包含 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. Loto实践干货(3) 测量CAN总线通讯数据

    Loto实践干货(3) 测量CAN总线通讯数据 最近在做运动控制卡的项目,调试样机的过程中,需要验证CAN总线通讯功能的正确性.以前只限于理论上认识CAN总线,使用的CANbus的通讯卡也是有上位机例 ...

  2. ChatTuGraph:通过大模型“与图对话”

    使用SQL(Structured Query Language)对数据库/数据仓库进行查询分析操作,几乎成了研发工程师和数据分析师的"家常便饭",然而要写出高效.清晰.优雅的SQL ...

  3. 关于FTP文件传输协议说明,带你了解更详情的文件传输协议

    Internet和其他网络上的人与设备之间的通信使用协议进行.您可以说协议定义了对话规则:谁必须在何时发送哪些信息?如果数据没有到达接收者,会发生什么?您如何保护转帐免受错误和犯规?每当我们使用Int ...

  4. Spring Cloud项目搭建版本选择

    1.查看spring cloud的版本 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4 ...

  5. KingbaseES toast技术原理及实现

    前言 1.TOAST的作用 TOAST全称是The Oversized-Attribute Storage Technique, 超大属性存储技术,就是超长字段在数据库中的存储方式.主要用来应对物理数 ...

  6. 在 kubernetes 环境下如何优雅扩缩容 Pulsar

    背景 在整个大环境的降本增效的熏陶下,我们也不得不做好应对方案. 根据对线上流量.存储以及系统资源的占用,发现我们的 Pulsar 集群有许多的冗余,所以考虑进行缩容从而减少资源浪费,最终也能省一些费 ...

  7. WPF如何封装一个可扩展的Window

    前言 WPF中Window相信大家都很熟悉,有时我们有一些自定义需求默认Window是无法满足的,比如在标题栏上放一些自己东西,这个时候我们就需要写一个自己的Window,实现起来也很简单,只要给Wi ...

  8. Spring框架之控制反转IoC(Inversion of Control)的理解

    简单理解: 控制反转就是将代码的调用权(控制权)从调用方转移给被调用方(服务提供方). 解释一下: 如果我们需要创建某个类,就需要程序员去修改代码,然后才可以得到想要的类.反转的意思就是不需要程序员去 ...

  9. Hadoop_08 Hadoop重装

    今日总结: 由于之前配置存在问题,今天学到后面之后发现很多bug,需要全部卸载重新配置Hadoop.ZooKeeper以及Hbase.

  10. #模拟#U137456 数字

    题目 牛牛和他的小伙伴们高高兴兴的吃完了蛋糕,吃完蛋糕之后就到了牛牛和他的小伙伴们最喜欢的环节了--猜数 字, 这次是牛牛的生日,大家决定让牛牛来制定规则,由于牛牛的生日是4月7日,所以牛牛特别喜欢数 ...