<题目链接>

题目大意:

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

输入格式:

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

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

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

解题分析:

由于本题在保证路径最短的情况下,还要使路径上的点权和最大,所以我们在最短路的松弛过程中,优先松弛路径,如果最短路径相同,再考虑挑选点券和最大的路,并且,最短路的条数也能够在Dijkstra松弛的过程中维护。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = ;
  5. const int INF = 0x3f3f3f3f;
  6. #define pb push_back
  7. int n,m,st,ed;
  8. struct Edge{ int to,val; };
  9. vector<Edge>G[N];
  10. int path[N],vis[N],num[N];
  11.  
  12. struct Node{
  13. int loc,dist,mxval,cnt;
  14. Node(int _loc=,int _dist=,int _mxval=,int _cnt=):loc(_loc),dist(_dist),mxval(_mxval),cnt(_cnt){}
  15. bool operator < (const Node &tmp)const{
  16. return dist>tmp.dist;
  17. }
  18. }node[N];
  19.  
  20. void Dij(){
  21. memset(path,-,sizeof(path));
  22. for(int i=;i<n;i++){
  23. vis[i]=,node[i]=Node(i,INF,,);
  24. }
  25. priority_queue<Node>q;
  26. node[st]=Node(st,,num[st],);
  27. q.push(node[st]);
  28. while(!q.empty()){
  29. int u=q.top().loc;q.pop();
  30. if(vis[u])continue;
  31. vis[u]=;
  32. for(int i=;i<G[u].size();i++){
  33. int v=G[u][i].to,cost=G[u][i].val;
  34. if(node[v].dist>node[u].dist+cost){
  35. node[v].dist=node[u].dist+cost;
  36. path[v]=u; //记录上一个点
  37. node[v].cnt=node[u].cnt; //更新这个点的最短路条数
  38. node[v].mxval=node[u].mxval+num[v]; //记录以这个点为终点的最短路的点权和
  39. q.push(node[v]);
  40. }else if(node[v].dist==node[u].dist+cost){
  41. node[v].cnt+=node[u].cnt; //因为有多条最短路径,所以这里将之前的最短路径条数加起来
  42. if(node[v].mxval<node[u].mxval+num[v]){ //更新最短路径上的点权最小值
  43. node[v].mxval=node[u].mxval+num[v];
  44. path[v]=u;
  45. }
  46. }
  47. }
  48. }
  49. }
  50.  
  51. void Print(int u){ //递归打印路径
  52. if(u==st){
  53. printf("%d",st);return;
  54. }
  55. Print(path[u]);
  56. printf(" %d",u);
  57. }
  58.  
  59. int main(){
  60. scanf("%d%d%d%d",&n,&m,&st,&ed);
  61. for(int i=;i<n;i++)scanf("%d",&num[i]);
  62. for(int i=;i<m;i++){
  63. int u,v,w;scanf("%d%d%d",&u,&v,&w);
  64. G[u].pb(Edge{v,w});
  65. G[v].pb(Edge{u,w});
  66. }
  67. Dij();
  68. printf("%d %d\n",node[ed].cnt,node[ed].mxval);
  69. Print(ed);puts("");
  70. return ;
  71. }

PTA L2-001 紧急救援 (带权最短路)的更多相关文章

  1. 51nod1459 带权最短路

    1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分 ...

  2. 51nod1459(带权值的dijkstra)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...

  3. hdu5045:带权二分图匹配

    题目大意 : n个人 做m道题,其中 每连续的n道必须由不同的人做 已知第i人做出第j题的概率为pij,求最大期望 思路:考虑每连续的n道题 都要n个人来做,显然想到了带权的二分图匹配 然后就是套模板 ...

  4. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...

  5. Codeforces.739E.Gosha is hunting(DP 带权二分)

    题目链接 \(Description\) 有\(n\)只精灵,两种精灵球(高级和低级),每种球能捕捉到第\(i\)只精灵的概率已知.求用\(A\)个低级球和\(B\)个高级球能捕捉到精灵数的最大期望. ...

  6. BZOJ_4609_[Wf2016]Branch Assignment_决策单调性+带权二分

    BZOJ_4609_[Wf2016]Branch Assignment_决策单调性+带权二分 Description 要完成一个由s个子项目组成的项目,给b(b>=s)个部门分配,从而把b个部门 ...

  7. Hdu 2047 Zjnu Stadium(带权并查集)

    Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. POJ 1703 Find them, Catch them(带权并查集)

    传送门 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42463   Accep ...

  9. Java数据结构——带权图

    带权图的最小生成树--Prim算法和Kruskal算法 带权图的最短路径算法--Dijkstra算法 package graph; // path.java // demonstrates short ...

随机推荐

  1. bash 字符串处理

    bash 字符串处理 字符串切片:${var:offset:length}示例:[root@localhost ~]#mypath="/etc/sysconfig/network-scrip ...

  2. Bigtable:A Distributed Storage System for Strctured Data

    2006 年10 月Google 发布三架马车之一的<Bigtable:A Distributed Storage System for Strctured Data>论文之后,Power ...

  3. Spring中的AOP 专题

    Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...

  4. python之路day06--python2/3小区别,小数据池的概念,编码的进阶str转为bytes类型,编码和解码

    python2#print() print'abc'#range() xrange()生成器#raw_input() python3# print('abc')# range()# input() = ...

  5. 第六节:深入研究Task实例方法ContinueWith的参数TaskContinuationOptions

    一. 整体说明 揭秘: 该章节的性质和上一个章节类似,也是一个扩展的章节,主要来研究Task类下的实例方法ContinueWith中的参数TaskContinuationOptions. 通过F12查 ...

  6. [再寄小读者之数学篇](2014-06-23 积分不等式 [中国科学技术大学2013年高等数学B 考研试题])

    设 $f(x)$ 在 $[a,b]$ 上一阶连续可导, $f(a)=0$. 证明: $$\bex \int_a^b f^2(x)\rd x\leq \cfrac{(b-a)^2}{2}\int_a^b ...

  7. django中的一对一、一对多、多对多及ForeignKey()

    参考文章: Django ORM.一对一.一对多.多对多.详解 刘江的博客——关系类型字段 问题: OneToOneField()与ForeignKey()的区别及其使用场景

  8. secureCRT免密码登陆Linux

    转自:http://blog.csdn.net/wangquannetwork/article/details/46062675 1.实现原理: 通过CRT生成的密钥对,把公钥上传到Linux服务器指 ...

  9. JAVA进阶4

    间歇性混吃等死,持续性踌躇满志系列-------------第4天 1.静态内部类求极值 class MaxMin{ public static class Result{ //表示最大值.最小值 p ...

  10. HTTP报错401和403详解及解决办法

    一.401: 1. HTTP 401 错误 - 未授权: (Unauthorized) 您的Web服务器认为,客户端发送的 HTTP 数据流是正确的,但进入网址 (URL) 资源 , 需要用户身份验证 ...