链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840


题目:

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:

输入第一行给出4个正整数N、M、S、D,其中N(2)是城市的个数,顺便假设城市的编号为0 ~ (;M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。

第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式:

第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2

输出样例:

2 60
0 1 3

题意:
有n个城市 m条路径 起点为s 终点为d 每个城市拥有的价值为num[i] 求出一条最短路 使得路径最短并且尽可能价值最大
题目保证最佳选择存在并唯一
要求输出为最短路径条数和最大的价值和 路径打印 思路:
题目描述有一个坑点 即输出的最短路径条数不是指最后所求的最佳路径上有几条路 而是抛开价值的条件 单纯求距离最短的最短路径有几条
采用dijkstra的思路 用邻接矩阵来存图 但是有不足的地方 即邻接矩阵无法处理最短路计数中的重边 但是数据中应该没有重边数据 之后打算转用邻接表再写一遍
在寻边操作中 只要按照距离来找就可以 因为后来都会更新一遍
在松弛操作时 采用了两个关键词 主关键词为距离dis 记录当前总距离 副关键词为tot 记录当前总价值 如果是用距离来更新的 路径记录dis1[j]=dis1[tmp]
如果路径相等 不管是否用价值更新 路径记录均为dis1[j]+=dis1[tmp] 当前节点加上到tmp节点的最短路径数量
在路径输出部分 存储顺序为倒序 输出时要从后往前

代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm> using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int maxn=;
int n,m,s,d,x,y,w;
int mp[maxn][maxn],dis[maxn],dis1[maxn],tot[maxn],vis[maxn],num[maxn],ans[maxn],path[maxn]; void dijkstra(int st){
for(int i=;i<n;i++){
dis[i]=inf;
vis[i]=;
dis1[i]=;
}
dis[st]=;tot[st]=num[st];
vis[st]=;dis1[st]=;
for(int i=;i<n;i++){
int tmp,minn=inf,maxx=-;
for(int j=;j<n;j++){
if(!vis[j] && (dis[j]<minn)){
minn=dis[j];
tmp=j;
} }
cout<<tmp<<" "<<minn<<" "<<dis1[tmp]<<endl;
if(minn==inf) break;vis[tmp]=;
for(int j=;j<n;j++){
if(!vis[j] && dis[tmp]+mp[tmp][j]<dis[j]){
dis1[j]=dis1[tmp];
dis[j]=dis[tmp]+mp[tmp][j];
tot[j]=tot[tmp]+num[j];
path[j]=tmp;
}
else if(!vis[j] && dis[tmp]+mp[tmp][j]==dis[j]){
if(tot[tmp]+num[j]>tot[j]){
tot[j]=tot[tmp]+num[j];
path[j]=tmp;
}
dis1[j]+=dis1[tmp];//加上到tmp节点的最短路径数量
}
}
}
} int main(){
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=;i<n;i++){
scanf("%d",&num[i]);
}
for(int i=;i<n;i++)
for(int j=;j<n;j++)
mp[i][j]=inf;
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&w);
w=min(mp[x][y],w);
mp[x][y]=mp[y][x]=w;
}
dijkstra(s);
printf("%d %d\n",dis1[d],tot[d]);
int cnt=;
for(int i=d;i>=;i=path[i]){
ans[++cnt]=i;
if(i==s) break;
}
for(int i=cnt;i>;i--){
printf("%d ",ans[i]);
}
printf("%d\n",ans[]);
return ;
}

 

L2-001 紧急救援 (25 分) (最短路+路径打印)的更多相关文章

  1. 5-5 城市间紧急救援 (25分)【最短路spfa】

    5-5 城市间紧急救援   (25分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速 ...

  2. PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)

    PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...

  3. 天梯L2-001. 紧急救援(25分)

    L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...

  4. PAT-1003 Emergency (25 分) 最短路最大点权+求相同cost最短路的数量

    As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...

  5. BFS(最短路+路径打印) POJ 3984 迷宫问题

    题目传送门 /* BFS:额,这题的数据范围太小了.但是重点是最短路的求法和输出路径的写法. dir数组记录是当前点的上一个点是从哪个方向过来的,搜索+,那么回溯- */ /************* ...

  6. L2-001 紧急救援 (25 分)

    L2-001 紧急救援 (25 分)   作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...

  7. 天梯 L2 紧急救援 (dijkstra变形+记录路径)

    L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...

  8. 城市间紧急救援(25 分)(dijstra变形)

    城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...

  9. PTA 05-树7 堆中的路径 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/713 5-5 堆中的路径   (25分) 将一系列给定数字插入一个初始为空的小顶堆H[] ...

随机推荐

  1. error C2381: “exit”: 重定义;__declspec(noreturn) 不同

    问题: error C2381: “exit” : 重定义:__declspec(noreturn) 不同 解决办法: 调换一下头文件的包含次序: #include <GL/glut.h> ...

  2. Spring Cloud:Security OAuth2 自定义异常响应

    对于客户端开发或者网站开发而言,调用接口返回有统一的响应体,可以针对性的设计界面,代码结构更加清晰,层次也更加分明. 默认异常响应 在使用 Spring Security Oauth2 登录和鉴权失败 ...

  3. MongoDB Change Stream:简介、尝试与应用

    在MongoDB3.6引入的新feature中,change stream无疑是非常吸引人的. Change streams allow applications to access real-tim ...

  4. Elasticsearch通关教程(一): 基础入门

    简介 Elasticsearch是一个高度可扩展的.开源的.基于 Lucene 的全文搜索和分析引擎.它允许您快速,近实时地存储,搜索和分析大量数据,并支持多租户. Elasticsearch也使用J ...

  5. Python的dnspython库使用指南

    因为平时在测试DNS的时候有些操作手动完成不方便,所以需要用到脚本,而在Python里dnspython这个用于DNS操作的库十分强大,但是无奈网上大部分资料只列举了少部分的用法,所以记录一下我平时使 ...

  6. Oracle普通视图和物化视图的区别

    介绍 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询, Oracle 都实际上转换为视图SQL语句的查询. ...

  7. centos7之rsync+serrsync

    Rsync+Inotify-tools与Rsync+sersync这两种架构有什么区别 1.Rsync+Inotify-tools(1):Inotify-tools只能记录下被监听的目录发生了变化(包 ...

  8. [模板] dfs序, 树链剖分, 换根

    树链剖分 树链剖分是一种对树的分治, 可以把树上的任意一条链分解为 \(O(\log n)\) 条在dfs序上相邻的子链, 便于数据结构(如线段树)来维护. 另外, 子树在dfs序上也是一个连续的区间 ...

  9. Django+Vue打造购物网站(八)

    购物车.订单管理和远程调试 添加商品到购物车 trade/serializers.py from rest_framework import serializers from goods.models ...

  10. 初识 go 语言:数据类型

    目录 数据类型 指针 结构体 数组 切片 切片的方法 映射 函数闭包 结束语 前言: go语言的第三篇文章,主要讲述go语言中的数据类型,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示 ...