pta—紧急救援 (dijkstra)
题目连接: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中。
![](/assets/blank.gif)
![](/assets/blank.gif)
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 }
View Code
pta—紧急救援 (dijkstra)相关推荐
- pta l2-1紧急救援(Dijkstra)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 题意:给n个城市,m条边,每个城市 ...
- pta紧急救援java,PTA——城市间紧急救援
PTA--城市间紧急救援 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在 ...
- 紧急救援 dijkstra
紧急救援 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城 ...
- 城市间紧急救援(Dijkstra算法)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...
- 7-3 城市间紧急救援(Dijkstra)
我们采用的是优先队列形式的Dijkstra算法,具体操作和解析如下代码 #include<bits/stdc++.h> using namespace std; typedef pair& ...
- 【天梯赛 - L2习题集】啃题(12 / 44)
目录 !L2-001 城市间紧急救援 - Dijkstra运用 !L2-002 链表去重 - 链表模拟 !L2-003 月饼 - 结构体+重载运算符+排序 !L2-004 这是二叉搜索树吗?- 建二叉 ...
- [PTA]L2-001 紧急救援 (25 分)
L2-001 紧急救援 (25 分) Description 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每 ...
- 【CCCC】L2-001 紧急救援 (25分),,Dijkstra标准模板(多路径,最大点权和路径打印)
problem L2-001 紧急救援 (25分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两 ...
- L2-001. 紧急救援 (dijkstra算法)
L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...
最新文章
- 从零开始玩人工智能-人脸 API-03
- mysql主从同步 sql_mysql主从同步报错;Slave_SQL_Running: No
- go语言游戏编程-Ebiten实现画面的填充
- 【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务
- 自动设置图片的序号_编写学位论文时如何给表格和图片自动编号
- 如何建立个人博客网站
- Tomcat学习总结(19)—— 为什么首选Tomcat作为JavaWeb应用服务器?
- 使用Shell遍历目录及其子目录中的所有文件方法
- 洛谷——P1720 月落乌啼算钱(斐波那契数列)
- 第一章节 c#面向对象
- 如何应用人工智能和大数据
- 【转】nginx禁止访问某个文件和目录(文件夹)
- 车间调度建模系列8|扩展析取图之基于时间片段的赋时三维析取图模型
- 基于51单片机的蓝牙循迹小车
- 删除ubuntu后修复win7系统的引导
- 计算机电子电路原理图,学看电路原理图入门知识积累 - 全文
- poi根据模版生成多页word,并压缩下载
- 一个不超过200行的游戏
- 服务器和交换机物理连接_二层、三层及四层交换机的区别 | 小知识
- ps打造人物光滑的肤色