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 ...
随机推荐
- multisim的支路及总线设计
Multisim的支路及总线设计 1.实验原理 最近在使用multisim设计时,用到了总线和支路设计,这里记录一下,方便以后查阅相关操作.其中主要是总线的使用和支路连接器的使用. 2.实验操作 (1 ...
- 基于proteus的数字电路设计
基于proteus的数字电路设计 1.实验原理 proteus的数字电路仿真能力还是比较强大的.这里总结一下proteus的几个基本操作以备后用.大致包括74hc系列的使用.常用调试设备.仿真开关.器 ...
- UEFI引导双系统安装archlinux后安装windows8.1,os-prober无法探测,生成grub.cfg没有windows
1.os-prober无法探测 可能是os-prober未启用 启用os-prober: sudo vim /etc/default/grub 添加: GRUB_DISABLE_OS_PROBER=f ...
- 企业数据清洗项目实践day3
封装昨天的生成json方法,生成标准字段方法以及生成最终文件的方法. 1 import pandas as pd 2 import xlwt 3 """ 4 rank的一 ...
- #双指针#洛谷 7405 [JOI 2021 Final] 雪玉
题目传送门 分析 无论怎样刮风,雪球的相对位置不会改变, 实际上每一个空段都由左右两个雪球瓜分(边界空段除外), 那么按照空段长度从小到大排序,用双指针找到恰好第一个未瓜分的位置 代码 #includ ...
- CMake 常用命令大全:提高项目构建效率
CMake是一个跨平台.开源的构建工具,它可以自动生成Makefile或者Visual Studio等IDE的工程文件.它能够帮助开发者更方便地管理项目的构建过程,提高项目构建的效率.在本文中,我们将 ...
- 面试连环炮系列(二十六):什么情况下JVM频繁发生full GC
1. 什么情况下JVM频繁发生full GC? full gc触发条件是老年代空间不足,具体原因有四个: 系统并发高.执行耗时长或者创建对象过多,导致 young gc频繁,且gc后存活对象太多,但是 ...
- CTR预估系列模型漫谈
FM FM的主要内容 了解fm模型之前,需要先说一下lr带入一下场景.lr作为早期ctr预估里面的模型,其速度上有着无可比拟的优势,而偏偏ctr场景下伴随着有大量的离散特征,高维稀疏特征,这个很适合l ...
- 什么是ip协议一
前言 两节结束,为网络底层系列做铺垫. 首先来看一张图: IOS有七层,但是我们可以简化层4层,ip属于传输层,可以说是非常重要,下面简单的做一个介绍. 正文 ip的介绍: 1.ip是tcp/ip 协 ...
- llm构建数据标注助手
为什么要用LLM构建数据标注工具 在LLM出现之前,传统的深度学习模型(包括CV和NLP)就已经需要大量的数据进行训练和微调.没有足够的数据,或者数据需要进行二次加工(比如标签标注),这些问题都成为限 ...