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

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

输入规格:

每个输入文件包含一个测试用例。 对于每个测试用例,第一行包含 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. .NET Emit 入门教程:第四部分:构建类型(Type)

    前言: 在动态生成代码的过程中,构建类型(Type)是至关重要的一步. 通过使用 Emit 中的 TypeBuilder,我们可以定义和创建各种类型,包括类.结构体和接口. 本节将深入探讨如何使用 T ...

  2. Oracle查询表空间信息

    记录一下 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_ ...

  3. C++设计模式 - 享元模式(Flyweight)

    对象性能模式 面向对象很好地解决了"抽象"的问题,但是必不可免地要付出一定的代价.对于通常情况来讲,面向对象的成本大都可以忽略不计.但是某些情况,面向对象所带来的成本必须谨慎处理. ...

  4. 5W1H聊开源之Why——为什么要参与开源?

    中国开源的发展速度发展加快,个人和组织对于为开源作贡献有着前所未有的激情.据<2020年IT行业项目管理调查报告>,约四成受访者以自己开发开源项目.为他人提交项目代码.作为成员开发维护项目 ...

  5. 帕鲁重大更新!macOS 竟然也能玩了

    近日,<幻兽帕鲁>迎来了 v0.2.1.0 大版本的更新. 本次更新的最大亮点是新实装的突袭头目系统.玩家可以在 "召唤祭坛" 献祭石板,从而召唤强大的突袭头目.其中, ...

  6. 上新啦KIT

    HMS Core上新啦!分析服务区服分析全新上线:机器学习服务OCR新增手写识别服务:3D建模续扫能力更新:视频编辑服务支持自定义上传素材--更多#HMS Core#能力可点击网页链接了解. 了解更多 ...

  7. 使用Python-psycopg访问postgres、openGauss、MogDB

    摘要 Psycopg 是一种用于执行 SQL 语句的 PythonAPI,可以为 PostgreSQL.GaussDB 数据库提供统一访问接口,应用程序可基于它进行数据操作.Psycopg2 是对 l ...

  8. Linux之隔离技术

    前言 Linux的内核有两大特性Namespace和CGroup,这两种特性可以在Linux主机上实现主机名.用户.网络等全局资源的隔离,也是实现网络虚拟化.容器技术的基础. 命名空间 Linux N ...

  9. Prometheus之grafana(No data to show)

    一.问题现象 1.grafana添加数据源后获取不到监控数据(No data to show) 2.prometheus以下报错 二.问题原因 服务器与浏览器时间不同步的原因,服务器端配置NTP服务和 ...

  10. Hadoop之Hive架构与设计

    Hadoop之Hive架构与设计 Hadoop是一个能够对大量数据进行分布式处理的软件框架.具有可靠.高效.可伸缩的特点. HDFS:全称为Hadoop分布式文件系统(Hadoop Distribut ...