题目连接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840

题面:

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

输入格式:

输入第一行给出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

题解:dijkstra计算最短路的长度,结果保存在数组d中,数组path记录最短路的条数。 利用前缀数组pre记录最短路的路径,利用栈输出; 数组val表示每个点的权值,最短路中权值最大的保存在数组tol中。

 1 #include<stdio.h>
2 #include<algorithm>
3 #include<string.h>
4 #include<stack>
5 using namespace std;
6
7 const int INF=0x3f3f3f3f;
8 const int maxn=510;
9 int pre[maxn],path[maxn],tol[maxn],val[maxn];
10 int cost[maxn][maxn],d[maxn],used[maxn];
11 int n,m;
12
13 void init()
14 {
15 fill(d,d+n,INF);
16 memset(used,0,sizeof used);
17 memset(pre,-1,sizeof pre);
18 }
19
20 void dijkstra(int s)
21 {
22 init();
23 d[s]=0;
24 path[s]=1;
25 tol[s]=val[s];
26 while(1){
27 int v=-1;
28 for(int u=0;u<n;u++)
29 if(!used[u]&&(v==-1||d[u]<d[v])) v=u;
30 if(v==-1) break;
31 used[v]=1;
32 for(int u=0;u<n;u++){
33 if(!used[u]&&cost[u][v]!=INF){
34 if(d[u]>d[v]+cost[v][u]){
35 d[u]=d[v]+cost[v][u];
36 pre[u]=v;
37 path[u]=path[v];
38 tol[u]=tol[v]+val[u];
39 }
40 else if(d[u]==d[v]+cost[v][u]){
41 path[u]+=path[v];
42 if(tol[u]<tol[v]+val[u]){
43 pre[u]=v;
44 tol[u]=tol[v]+val[u];
45 }
46 }
47 }
48 }
49 }
50 }
51
52 void print(int t)
53 {
54 stack<int> q;
55 for(;t!=-1;t=pre[t])
56 q.push(t);
57 while(!q.empty()){
58 int k=q.top();
59 q.pop();
60 printf("%d",k);
61 if(!q.empty()) printf(" ");
62 else printf("\n");
63 }
64 }
65
66 int main()
67 {
68 int s,t;
69 scanf("%d%d%d%d",&n,&m,&s,&t);
70 for(int i=0;i<n;i++)
71 scanf("%d",&val[i]);
72 for(int i=0;i<n;i++){
73 for(int j=0;j<n;j++){
74 if(i!=j) cost[i][j]=INF;
75 }
76 }
77 for(int i=0;i<m;i++){
78 int u,v,w;
79 scanf("%d%d%d",&u,&v,&w);
80 cost[u][v]=cost[v][u]=w;
81 }
82 dijkstra(s);
83 printf("%d %d\n",path[t],tol[t]);
84 print(t);
85 return 0;
86 }

pta—紧急救援 (dijkstra)的更多相关文章

  1. PTA 紧急救援 /// dijkstra 最短路数 输出路径

    题目大意: 给定 n m s t :表示n个点编号为0~n-1 m条边 起点s终点t 接下来一行给定n个数:表示第i个点的救援队数量 接下来m行给定u v w:表示点u到点v有一条长度为w的边 求从s ...

  2. pta l2-1紧急救援(Dijkstra)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 题意:给n个城市,m条边,每个城市 ...

  3. L2-001. 紧急救援---(Dijkstra,记录路径)

    https://www.patest.cn/contests/gplt/L2-001 L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 ...

  4. L2-001. 紧急救援 (Dijkstra算法打印路径)

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

  5. 城市间紧急救援 Dijkstra

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

  6. PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集

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

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

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

  8. 团体程序设计天梯赛-练习集L2-001. 紧急救援(dijkstra)

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

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

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

随机推荐

  1. 【对线面试官】Java 反射&&动态代理

    // 抽象类,定义泛型<T> public abstract class BaseDao<T> { public BaseDao(){ Class clazz = this.g ...

  2. 关于使用jq跨域请求的实现

    今天算是把js跨域请求搞定了,想实现跨越,首先想到的是JSONP,但是具体去做的时候,发现有很多坑.在本地测试好之后又发现目标网站做了https证书认证,也就是实用的jsonp请求地址必须是https ...

  3. 关于 percona monitoring plugins插件报slave is stoped on ip地址

    思路:肯定是某个item触发了触发器 去看触发器,找到 slave is stoped,如下图 看到键是mysql.running-slave ,然后去定义key的文件中查看该键对应的脚本,修改脚本. ...

  4. 怎么启用apache的mod_log_sql模块将所有的访问信息直接记录在mysql中

    怎么启用apache的mod_log_sql模块将所有的访问信息直接记录在mysql中

  5. 【windows】快捷键

    Ctrl+字母键 1.Ctrl+A:全选 2.Ctrl+C:复制选择的项目 3.Ctrl+E:选择搜索框 4.Ctrl+F:选择搜索框 5.Ctrl+N:创建新的项目 6.Ctrl+W:关闭当前窗口 ...

  6. .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)

    在.NET Core部署到linux(CentOS)最全解决方案,常规篇一文,我们详细讲解了传统的.NET Core部署到Linux服务器的方法,学到了Linux在虚拟机下的安装.Xshell,Xft ...

  7. SAP表的锁定与解锁

    表的锁定模式有三种模式. lock mode有三种模式:分别是S,E,X.含义如下:     S (Shared lock, read lock)     E (Exclusive lock, wri ...

  8. redis 主从复制(一主两从)

    一.环境基本信息 系统 centos7 版本 redis 5.0.7 只用了一台机器,ip:192.168.64.123 master端口 6379,从机 端口 6380.6381 二.redis目录 ...

  9. [Usaco2008 Mar]牛跑步

    题目描述 BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. BESSIE也不想跑得太远,所以她想走最短的路经. 农场上一共有M (1 < ...

  10. 探索微软开源Python自动化神器Playwright

    相信玩过爬虫的朋友都知道selenium,一个自动化测试的神器工具.写个Python自动化脚本解放双手基本上是常规的操作了,爬虫爬不了的,就用自动化测试凑一凑. 虽然selenium有完备的文档,但也 ...