链接: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的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

  1. 4 5 0 3
  2. 20 30 40 10
  3. 0 1 1
  4. 1 3 2
  5. 0 3 3
  6. 0 2 2
  7. 2 3 2

输出样例:

  1. 2 60
  2. 0 1 3

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

  1. 代码:
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <string>
  6. #include <cstring>
  7. #include <algorithm>
  8.  
  9. using namespace std;
  10. typedef long long ll;
  11. typedef unsigned long long ull;
  12. const int inf=0x3f3f3f3f;
  13. const int maxn=;
  14. int n,m,s,d,x,y,w;
  15. int mp[maxn][maxn],dis[maxn],dis1[maxn],tot[maxn],vis[maxn],num[maxn],ans[maxn],path[maxn];
  16.  
  17. void dijkstra(int st){
  18. for(int i=;i<n;i++){
  19. dis[i]=inf;
  20. vis[i]=;
  21. dis1[i]=;
  22. }
  23. dis[st]=;tot[st]=num[st];
  24. vis[st]=;dis1[st]=;
  25. for(int i=;i<n;i++){
  26. int tmp,minn=inf,maxx=-;
  27. for(int j=;j<n;j++){
  28. if(!vis[j] && (dis[j]<minn)){
  29. minn=dis[j];
  30. tmp=j;
  31. }
  32.  
  33. }
  34. cout<<tmp<<" "<<minn<<" "<<dis1[tmp]<<endl;
  35. if(minn==inf) break;vis[tmp]=;
  36. for(int j=;j<n;j++){
  37. if(!vis[j] && dis[tmp]+mp[tmp][j]<dis[j]){
  38. dis1[j]=dis1[tmp];
  39. dis[j]=dis[tmp]+mp[tmp][j];
  40. tot[j]=tot[tmp]+num[j];
  41. path[j]=tmp;
  42. }
  43. else if(!vis[j] && dis[tmp]+mp[tmp][j]==dis[j]){
  44. if(tot[tmp]+num[j]>tot[j]){
  45. tot[j]=tot[tmp]+num[j];
  46. path[j]=tmp;
  47. }
  48. dis1[j]+=dis1[tmp];//加上到tmp节点的最短路径数量
  49. }
  50. }
  51. }
  52. }
  53.  
  54. int main(){
  55. scanf("%d%d%d%d",&n,&m,&s,&d);
  56. for(int i=;i<n;i++){
  57. scanf("%d",&num[i]);
  58. }
  59. for(int i=;i<n;i++)
  60. for(int j=;j<n;j++)
  61. mp[i][j]=inf;
  62. for(int i=;i<=m;i++){
  63. scanf("%d%d%d",&x,&y,&w);
  64. w=min(mp[x][y],w);
  65. mp[x][y]=mp[y][x]=w;
  66. }
  67. dijkstra(s);
  68. printf("%d %d\n",dis1[d],tot[d]);
  69. int cnt=;
  70. for(int i=d;i>=;i=path[i]){
  71. ans[++cnt]=i;
  72. if(i==s) break;
  73. }
  74. for(int i=cnt;i>;i--){
  75. printf("%d ",ans[i]);
  76. }
  77. printf("%d\n",ans[]);
  78. return ;
  79. }
  1.  
  1.  

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. java 服务端I/O非阻塞实现05

    /** * 非阻塞IO多线线程服务端 * 当一个任务进入多线程,这个任务线程需要处理接收信息.发送信息.因而发生I/O阻塞问题 * 利用selector可以实现异步 * */ public class ...

  2. P1273 有线电视网

    题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...

  3. 软件工程(FZU2015) 赛季得分榜,第11回合(beta冲刺+SE总结)

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分:beta30分 团队项目分=团队得分+个人贡献分 个人 ...

  4. Spring 使用纯注解方式完成IoC

    目录 创建一个简单的Person类 使用xml方式配置Spring容器并获取bean的过程 创建xml配置文件 进行测试 使用纯注解方式配置Spring容器并获取bean的过程 创建spring配置类 ...

  5. python配置文件的加载

    背景: 微信机器人项目用到了mysql数据库配置,阿里云OSS上传文件配置:现在需要将这些配置参数统一写到一个配置文件中统一管理,而不是分散的写在代码中 1. 使用.ini文件作为配置文件 例如: s ...

  6. python之内置函数(二)与匿名函数、递归函数初识

    一.内置函数(二)1.和数据结构相关(24)列表和元祖(2)list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素).tuple:将一个可迭代对象转化成元组(如果是字典,默认将k ...

  7. Flask的插件session、SQLAlchemy、Script、Migrate

    一.flask-session 1.为什么要使用flask-session 因为flask默认的session是通过请求上下文放入到Local中的,是存在内存的,而使用flask-session可以更 ...

  8. P2495 [SDOI2011]消耗战 lca倍增+虚树+树形dp

    题目:给出n个点的树  q次询问  问切断 k个点(不和1号点联通)的最小代价是多少 思路:树形dp  sum[i]表示切断i的子树中需要切断的点的最小代价是多少 mi[i]表示1--i中的最小边权 ...

  9. 【CF1132G】Greedy Subsequences(线段树)

    [CF1132G]Greedy Subsequences(线段树) 题面 CF 题解 首先发现选完一个数之后选择下一个数一定是确定的. 对于每个数预处理出左侧第一个比他大的数\(L\),那么这个数加入 ...

  10. centos 下安装显卡驱动步骤

    一. 先下载自己显卡对应的linux版本的驱动文件, 一般都是.run的一个文件. 二.如果是新安装的系统,先安装编译环境,gcc,kernel-devel,kernel-headers  (联网) ...