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

输入格式:

输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);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

SPFA的变形对于边<v,u>,dis[]表示距离,num[]表示到达某一点的人的数量,Num[][2]:Num[][1]表示在更行之前的路径的数量,<script type="math/tex" id="MathJax-Element-106">,\quad dis[] 表示距离,num[]表示到达某一点的人的数量,Num[][2]:Num[][1] 表示在更行之前的路径的数量,</script>
Num[][0],表示在更新之后的路径的数量Num[][0],表示在更新之后的路径的数量
如果dis[u]>dis[v]+e[i].w,不言而喻,我们的首要条件是最短,所如果dis[u]>dis[v]+e[i].w ,不言而喻,我们的首要条件是最短,所
以dis[u]=dis[v]+e[i].w,num[u]=a[u]+num[v],Num[u][1]=Num[u][0],Num[u][0]=Num[v][0]以dis[u] = dis[v]+e[i].w,num[u] = a[u]+num[v],Num[u][1] = Num[u][0],Num[u][0] = Num[v][0]
如果dis[u]=dis[v]+e[i].w,Num[u][1]=Num[u] 如果dis[u] = dis[v]+e[i].w ,Num[u][1] = Num[u][0], Num[u][0]+= (Num[v][0]-Num[v][1])\quad num[u] ==max(num[u],num[v]+a[u])$

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>using namespace std;const int INF = 0x3f3f3f3f;const int Max = 550;typedef struct node
{int v,w,next;
}edge;edge e[Max*Max];int H[Max],top;int Dis[Max];int num[Max],Num[Max][2];int pre[Max];bool vis[Max];int n,m,s,t;int a[Max];void AddEdge(int u,int v,int w)
{e[top].v = v; e[top].w = w;e[top].next =  H[u] ;  H[u] = top++;e[top].v = u; e[top].w = w;e[top].next =  H[v] ;  H[v] = top++;
}void SPFA()
{memset(Dis,INF,sizeof(Dis));for(int i = 0;i<n;i++){num[i] = a[i];pre[i] = -1;Num[i][0] = Num[i][1] = 0;vis[i] = false;}vis[s] = true;Dis[s] = 0;queue<int>Q;Num[s][0] = 1;Q.push(s);while(!Q.empty()){int u = Q.front();Q.pop();for(int i = H[u];~i;i= e[i].next){int v = e[i].v;if(Dis[v]>Dis[u]+e[i].w){Dis[v]  =Dis[u]+e[i].w;Num[v][1] = Num[v][0];Num[v][0] = Num[u][0];num[v] = a[v]+num[u];pre[v] = u;if(!vis[v]){vis[v] = true;Q.push(v);}}else if(Dis[v]==Dis[u]+e[i].w){Num[v][1] = Num[v][0];Num[v][0] += (Num[u][0]-Num[u][1]);if(num[v]<num[u]+a[v]){num[v] = num[u]+a[v];pre[v] = u;}if(!vis[v]){vis[v] = true;Q.push(v);}}}vis[u]= false;}}int main()
{int u,v,w;while(~scanf("%d %d %d %d",&n,&m,&s,&t)){for(int i = 0;i<n;i++){scanf("%d",&a[i]);}top =0 ;memset(H,-1,sizeof(H));for(int i = 0;i<m;i++){scanf("%d %d %d",&u,&v,&w);AddEdge(u,v,w);}SPFA();printf("%d %d\n",Num[t][0],num[t]);stack<int>S;for(int i = t ;~i;i  = pre[i]){S.push(i);}bool flag = false;while(!S.empty()){if(!flag) flag= true;else printf(" ");printf("%d",S.top());S.pop();}printf("\n");}return 0;
}

【PAT天梯赛练习集L2-1】紧急救援——SPFA相关推荐

  1. 【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码

    [CCCC]PAT : 团体程序设计天梯赛-练习集 L2 答案 鉴定完毕,全部水题 ヾ(•ω•`)o 知识点分类(32): 1.树锯结构(9):二叉树的存储,编号,遍历顺序转换,求深度,底层节点,从底 ...

  2. 团体程序设计天梯赛 -- 练习集 (L2合集)

    文章目录 L2-001 紧急救援 (25 分) L2-002 链表去重 (25 分) L2-003 月饼 (25 分) L2-004 这是二叉搜索树吗? (25 分) L2-005 集合相似度 (25 ...

  3. 团体程序设计天梯赛-练习集 L2 阶段全部题解

    L2-001. 紧急救援 地址链接:https://blog.csdn.net/dengkuomin/article/details/64498691 L2-002. 链表去重 地址链接:https: ...

  4. 【CCCC】PAT : 团体程序设计天梯赛-练习集 L3 答案(01-23)

    [CCCC]PAT : 团体程序设计天梯赛-练习集 L3 答案 顶着满课,整整一星期,终于咕完了.(:´д`)ゞ 知识点分类(23): 1.搜索模拟(5):BFS,DFS,最短路,路径打印 2.计算几 ...

  5. 【CCCC】PAT : 团体程序设计天梯赛-练习集 L1 答案

    [CCCC]PAT : 团体程序设计天梯赛-练习集 L1 答案 鉴定完毕,全部水题 ヾ(•ω•`)o 标号 标题 分数 通过数 提交数 通过率 L1-001 Hello World 5 46779 1 ...

  6. 团体程序设计天梯赛练习集题解整合

    网上介绍 团体程序设计天梯赛练习集 的文章已经很多了, 我的这篇文章是对练习集题解的整合,方便每一位备战 团体程序设计天梯赛 的同学使用. 一年一度的 团体程序设计天梯赛 即将开始,PTA的练习集是必 ...

  7. 团体程序设计天梯赛-练习集 L1-033——L1-048

    团体程序设计天梯赛-练习集 /** @Description: 出生年* @version: * @Author: * @Date: 2021-03-25 08:13:57* @LastEditors ...

  8. PTA团体程序设计天梯赛-练习集(3)

    PTA团体程序设计天梯赛-练习集 L1-001 Hello World (5 分) 这道超级简单的题目没有任何输入. 你只需要在一行中输出著名短句"Hello World!"就可以 ...

  9. PTA团体程序设计天梯赛-练习集

    PTA团体程序设计天梯赛-练习集 L1-024 后天 L1-025 正整数A+B L1-026 I Love GPLT L1-027 出租 L1-029 是不是太胖了 L1-030 一帮一 L1-03 ...

最新文章

  1. 代码生成器,自己实现的一个基于模板的在线代码生成网站
  2. 在Python中使用lightgbm
  3. 前端开发的模块化和组件化的定义,以及两者的关系
  4. Flash基本工具练习
  5. hao123电脑版主页_hao123浏览器 原生网民的记忆 一代站长的传奇
  6. 如何将自己的Java项目部署到外网
  7. swt 键盘事件ctrl+c_VB键盘事件详解
  8. jquery学习--对象
  9. pytorch tensor操作:tensor与numpy转换
  10. ijcai2017赛后总结
  11. 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响(二)
  12. sqlserver shiwu
  13. Python3,10行代码,给pdf文件去水印,再也不用花费冤枉钱了。
  14. 中国Android应用商店汇总
  15. Java-springboot生鲜电商项目(四)商品模块
  16. 第一集 斗罗世界 引子 穿越的唐家三少
  17. 在Gilt将微服务部署到AWS:ION-Roller简介
  18. 【计算机网络】知识梳理(二)物理层
  19. [敏捷开发实践] 使用RACI Matrix划分敏捷团队的RR
  20. 服务器微信服务号响应变慢,微信卡顿和响应慢,教大家轻松搞定:简单操作,赶快收藏分享吧...

热门文章

  1. HTML转换为word,简单记录
  2. 远古VOD系统相关操作 (=)
  3. 如何优雅的窥探别人?
  4. 模糊神经网络-PID Smith预估集成控制系统
  5. (转)SonicStage CP V4.4 已经被我汉化,现提供下载
  6. 计算机平板传输软件,“在iPad和计算机之间无线传输文件的方法”
  7. C/C++语言的应用领域
  8. eclipse百度云下载,通史还有汉化包
  9. java使用ftp下载文件到本地(只是下载)
  10. Linux mkdir命令