PTA7-12 城市间紧急救援 (25 分)

关于这个题呢,我当时也想了很久没有一点头绪。所以,菜鸡的我一如既往的打开了CSDN(手动滑稽)。我看了很多大佬的写法,最普遍的应该就是dijkstra+dp了。于是,在众多大佬的代码熏陶下,我琢磨出了比较简单的写法。也不能说简单,也就是代码可读性高一点而已。小白写文,如有错误还望多多谅解!

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

我就用注释来解释吧

//dijstra+dp
#include "bits/stdc++.h"
using namespace std;
int ma[501][501],peo[501],Count[501],vis[501],path[501],dist[501],ph[501];
//ma[501][501]表示地图,peo[501]表示拉的人数,Count[501]表示路的条数
//vis[501]标记点,path[501]记录路径,dist[501]最短距离,ph[501]每个城市的人数
int n,m,s,d;
void ath(int d)//打印路径
{if(path[d]!=-1){ath(path[d]);cout<<path[d]<<' ';}
}
int main()
{cin>>n>>m>>s>>d;memset(ma,0x3f,sizeof(ma));//图max memset(dist,0x3f,sizeof(dist));//点距max memset(path,-1,sizeof(path));//记录路径 memset(Count,1,sizeof(Count));//道路条数 for(int i=0;i<n;i++)   cin>>ph[i];//初始化...dist[s]=0;Count[s]=1;//vis[s]=1;peo[s]=ph[s];while(m--)//把路存到地图上{int j,k,l;cin>>j>>k>>l;ma[j][k]=ma[k][j]=l;}//接下来就是重头戏dijstra了for(int i=0;i<n;i++){int t=-1;for(int j=0;j<n;j++)//找距离最短的点{if((t==-1||dist[j]<dist[t])&&!vis[j]) t=j;}if(t==-1) break;//所有点都找过了vis[t]=1;//标记该点for(int j=0;j<n;j++){if(dist[t]+ma[t][j]<dist[j])//如果路径更短的话(又名松弛){dist[j]=dist[t]+ma[t][j];//更新距离path[j]=t;//记录路径Count[j]=Count[t];//记录路数peo[j]=ph[j]+peo[t];//记录总人数}else if(dist[t]+ma[t][j]==dist[j])//如果一样长{Count[j]+=Count[t];//路数就要增加if(peo[t]+ph[j]>peo[j])//如果人数更多{peo[j]=peo[t]+ph[j];//拉人path[j]=t;//记录路径}}}}cout<<Count[d]<<' '<<peo[d]<<endl;ath(d);cout<<d;
}

就这样王子和公主过上了幸福快乐的生活 我们就成功解决了这个题!
cheer!

PTA7-12 城市间紧急救援 (25 分)(dijkstra+dp)(简单易懂的写法)相关推荐

  1. 7-11 城市间紧急救援 (25 分)

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

  2. 5-35 城市间紧急救援 (25分)

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

  3. L2-001 城市间紧急救援 (25分)(迪杰斯特拉算法)

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

  4. 5-35 城市间紧急救援 (25分) pat 数据结构

    题目连接 https://pta.patest.cn/pta/test/15/exam/4/question/862 5-35 城市间紧急救援   (25分) 作为一个城市的应急救援队伍的负责人,你有 ...

  5. 城市间紧急救援 (25 分)

    //迪杰斯特拉算法求城市间紧急救援 #include<iostream> #include<cstring> using namespace std; #define num ...

  6. 城市间紧急救援 (25 分)【dijkstra模板 超时原因】

    立志用最少的代码做最高效的表达 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度 ...

  7. 7-35 城市间紧急救援 (25 分)(思路加详解)

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

  8. 7-2 城市间紧急救援 (25 分)

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

  9. 7-68 城市间紧急救援 (25 分)

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

最新文章

  1. python学会了可以做什么菜_python学习之路(24)
  2. matlab智能算法30个案例分析_赞!继电保护25个事故案例分析总结,值得收藏!...
  3. [Linux] 进程间通信
  4. PHP:6种GET和POST请求发送方法
  5. 我的世界javamod怎么装_「装修细节」除了中央空调外的高颜值装空调大法
  6. python可以调用c语言编写的底层代码吗_Python基础笔记系列十四:python无缝调用c程序...
  7. 排序算法:归并排序(C、Java)
  8. 实现高并发服务器之 I/O复用
  9. 刘谦春晚再掀魔术热 网上木马趁火打劫
  10. python培训价目表-Python培训一般要多少钱?
  11. kernel: segfault at *** rip *** rsp *** error
  12. IBM AIX存储层结构及操作命令实现
  13. javaeye搬家到csdn
  14. 3D打印-切片软件简介
  15. paypal注册流程
  16. 拍视频用30帧还是60帧更好,帧率如何设置60帧的问题
  17. 2020淘宝双十一快速刷金币工具
  18. insert 插入数据
  19. 冰河ddos压力测试系统_【XSENSOR】压力分布测试及分析系统 加拿大
  20. 洛谷1726 上白泽慧音 tarjan模板

热门文章

  1. 小哨兵还原卡密码如何清楚?
  2. autoIT 自动化上传/下载文件图文详解【python selenium】
  3. Windows ❀ Windows系统下端口连通性常见的验证方法
  4. 2019年第21周-01文章词频统计
  5. VNX中的DataMover
  6. Windows10 微软输入法突然变成繁体输入
  7. Java代码实现消消乐游戏中的消除功能
  8. Multisim基础 LC并联选频电路
  9. 恭贺象过河软件在郑州市场3年内突破2000家用户
  10. Multi-Objective Data Placement for Multi-Cloud Socially Aware Services---INFOCOM 2014