Dijkstra迪杰斯特拉求最短路和最短路的条数和各个点权值的最大值
作为一个城市的紧急救援队队长,你会得到一张你所在国家的特殊地图。 该地图显示了由一些道路连接的几个分散的城市。
地图上标出了每个城市的救援队伍数量以及任意两个城市之间每条道路的长度。 当其他城市接到紧急电话时,你的工作就是尽快带领你的人员赶到现场,同时在途中召集尽可能多的人手。
输入规格:
每个输入文件包含一个测试用例。 对于每个测试用例,第一行包含 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迪杰斯特拉求最短路和最短路的条数和各个点权值的最大值的更多相关文章
- Dijkstra(迪杰斯特拉求最短路径)-02-网络延迟时间
有 N 个网络节点,标记为 1 到 N. 给定一个列表 times,表示信号经过有向边的传递时间. times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节 ...
- 最短路之Dijkstra(迪杰斯特拉)
一般用法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代 ...
- Dijkstra(迪杰斯特拉)源最短路径 小白说明
源最短路径 小白说明 Dijkstra算法,书上其实说的很简洁,仔细看,仔细思考是会理解的.但要先理解几条引论和推理. 而自己思考的思路在不需要任何推理只从贪心思路出发,和Dijkstra有所不同,但 ...
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
Dijkstra算法 ———————————最后更新时间:2011.9.25———————————Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径. ...
- 图解Dijkstra(迪杰斯特拉)算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
- (Dijkstra)迪杰斯特拉算法-最短路径算法
迪杰斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想:设G=(V,E)是一个带权有向图 ...
- Dijkstra(迪杰斯特拉)算法求解最短路径
过程 首先需要记录每个点到原点的距离,这个距离会在每一轮遍历的过程中刷新.每一个节点到原点的最短路径是其上一个节点(前驱节点)到原点的最短路径加上前驱节点到该节点的距离.以这个原则,经过N轮计算就能得 ...
- CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数
题意: 给出n个点m条公路k条铁路. 接下来m行 u v w //u->v 距离w 然后k行 v w //1->v 距离w 如果修建了铁路并不影响两点的最短距离, ...
- 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 ...
随机推荐
- %USERPROFILE% 查看系统变量
%USERPROFILE% =C:\Users\用户名 win+r,输入cmd 回车 在cmd窗口下输入 set 回车,可以查看系统变量(想要了解更多 set 命令请看 这里)
- Python 生成二维码的几种方式、生成条形码
一: # 生成地维码 import qrcode import matplotlib.pyplot as plt from barcode.writer import ImageWriter 创建QR ...
- AXI4的主从机的收发机制
AXI4的收发机制 1.AXI4的译码器 对于多个主机和从机的AXI4总线的互联架构,译码器都是重要的.主机的端口一般有三个译码器,分别是读地址通道.写地址通道和写数据通道的译码器.主要作用是将通道的 ...
- kingbaseES 优化之操作系统瓶颈排查
针对操作系统性能瓶颈的判断和排查是数据库优化工作的一项重要技能,尤其是针对实例整体优化 操作系统的性能瓶颈排查无外乎四个方面 CPU.内存.磁盘.网络 针对这四个方面整理了一些相关心得和大家分享. 在 ...
- KingbaseES V8R6 集群运维案例 -- 禁止普通用户su到root
案例说明: 在集群管理中,会使用到root权限(如ip.aring命令等),为安全需要,有的生产环境禁止普通用户su切换到root,本案例测试了禁止普通用户su切换到root对集群管理带来的影响. 集 ...
- #Multi-SG#Poj 3537 Crosses and Crosses
题目 有\(n\)个格子,可以在上面涂黑,连续三个黑色获胜,问先手是否必胜 分析 如果先手选择第\(i\)个格子涂黑,那么后手对于\(i-1,i+1,i-2,i+2\)一旦涂黑必败, 所以如果第\(i ...
- #启发式合并,链表#洛谷 3201 [HNOI2009] 梦幻布丁
题目 \(n\)个布丁摆成一行,进行\(m\)次操作. 每次将某个颜色的布丁全部变成另一种颜色的, 然后再询问当前一共有多少段颜色. (\(n,m\leq 10^5,col\leq 10^6\)) 分 ...
- #欧拉函数#洛谷 2303 [SDOI2012] Longge 的问题
题目 求\(\sum_{i=1}^n\gcd(n,i)\) 分析 \(=\sum_{i=1}^n\sum_{d|gcd(n,i)}\varphi(d)\) \(=\sum_{d|n}\varphi(d ...
- OpenHarmony 分布式硬件关键技术
本文转载自 OpenHarmony TSC 官方微信公众号<峰会回顾第8期 | OpenHarmony 分布式硬件关键技术> 演讲嘉宾 | 李 刚 回顾整理 | 廖 涛 排版校对 ...
- Spring内存马分析
环境搭建 踩了很多坑....,不过还好最后还是成功了 IDEA直接新建javaEE项目,然后记得把index.jsp删了,不然DispatcherServlet会失效 导入依赖: <depend ...