题目连接

https://pta.patest.cn/pta/test/15/exam/4/question/862

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

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

输入格式:

输入第一行给出4个正整数NN、MM、SS、DD,其中NN(2\le N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N-1)(N−1);MM是快速道路的条数;SS是出发地的城市编号;DD是目的地的城市编号。

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

输出格式:

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

输入样例:

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

分析:这个问题首先是一个最短路的算法,这个载体还是比较简单的,但是,它的难点就在于它的相关附加内容。路径就用一个path数组记录,然后用一个递归调用就可以了。救援队的数量也是用一个数组来存放。这个问题的关键是最短路径的条数,这个问题我先是用一个全局变量来存放,可是后来发现这样不行,因为可能有几种不同的到达方式。所以就用了一个数组,又前往后的推理分析,从而得出最后的结论。但这道题确实好,坑也确实挺多,首先就是if else的分析,我以前不太喜欢用else这次就被坑惨了。。还有就是这个题,为了防止一些不必要的访问,对我原有的问题进行干扰,我设置了两个标记数组。vis主要是为了最短路而设计的,而另一个visited数组,主要是为了防止有一样的距离时,对我原有的好的结果造成干扰。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define infinity 100000

int arc[520][520]; // array for the picture
int dist[520]; //distance from the start city
int emer[520]; // emergency team at every city
int vis[520]; // mark array
int visited[520]; // another mark array
int path[520];
int rever_path[520];
int total_team[520]; // this node 's emergency team
int ans[520];

int main()
{
memset(ans,0,sizeof(ans));
int n,m,s,d; // n:the num of the city ; m:the num of the road; s:start city ; d:destination city;
//freopen("1.txt","r+",stdin);
scanf("%d%d%d%d",&n,&m,&s,&d);

for(int i=0; i<n; i++)
scanf("%d",&emer[i]);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
arc[i][j]=arc[j][i]=infinity;

}
for(int i=0; i<m; i++)
{
int start,next,distance;
scanf("%d%d%d",&start,&next,&distance);
arc[start][next]=arc[next][start]=distance;
}
if(s==d)
{
printf("1 %d\n",emer[s]);
printf("%d\n",s);
}
else{
for(int i=0; i<n; i++)
{
dist[i]=infinity;
if(arc[s][i]!=infinity)
{
dist[i]=arc[s][i];
ans[i]++;
}
}
for(int i=0; i<n; i++)
total_team[i]=emer[s];

memset(vis,0,sizeof(vis));
memset(visited,0,sizeof(visited));
dist[s]=0;
vis[s]=1;
int total_mindist=1;

for(int j=1; j<n; j++)
{
//printf("%d@\n",ans[3]);
int min_distance=infinity,min_position=s;
for(int i=0; i<n; i++)
{
if(!vis[i])
if(dist[i]<min_distance)
{
min_distance=dist[i];
min_position=i;
}
}
//ans[min_position]++;

vis[min_position]=1;
if(!visited[min_position]){
path[min_position]=s;
total_team[min_position]+=emer[min_position];
}
// printf("%d\n",min_position);
for(int i=0; i<n; i++)
{
if(!vis[i])
{
if(min_distance+arc[min_position][i]<dist[i])
{
ans[i]=ans[min_position];
//printf("%d11\n",ans[3]);
total_mindist=1;
dist[i]=min_distance+arc[min_position][i];
path[i]=min_position;
total_team[i]=total_team[min_position]+emer[i];
//printf("%d!*\n",total_team[3]);
visited[i]=1;
}
else if(min_distance+arc[min_position][i]==dist[i]) // else 防止上一个if语句对这个if造成的影响
{
ans[i]+=ans[min_position]; // 原来的路径数加上新增的路径数
if(total_team[min_position]+emer[i]>total_team[i])
{
total_mindist++;
total_team[i]=total_team[min_position]+emer[i];
path[i]=min_position;
//printf("%d\n",path[i]);
//printf("%d!\n",total_team[3]);
visited[i]=1;
}
}
}
// printf("%d!0%d\n",total_team[3],ans[3]);
}

}
int num=d,path_num=0;
//printf("%d0\n",path[3]);
while(num!=s)
{
//printf("%d\n",num);
//printf("#%d\n",path[num]);
rever_path[path_num]=num;
path_num++;

num=path[num];
//printf("%d\n",num);
}
rever_path[path_num]=s;
printf("%d %d\n",ans[d],total_team[d]);
num=d;
for(int i=path_num; i>0; i--)
printf("%d ",rever_path[i]);

printf("%d\n",d);
}
return 0;
}

转载于:https://www.cnblogs.com/hyx0123/p/7193303.html

5-35 城市间紧急救援 (25分) pat 数据结构相关推荐

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

    PTA7-12 城市间紧急救援 (25 分) 关于这个题呢,我当时也想了很久没有一点头绪.所以,菜鸡的我一如既往的打开了CSDN(手动滑稽).我看了很多大佬的写法,最普遍的应该就是dijkstra+d ...

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

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

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

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

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

    L2-001 城市间紧急救援 (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. 一目了然了解JAVA集合体系
  2. 四、【线性表】线性表的顺序表示和实现
  3. C语言linux getopt_long()函数(命令行解析)(getopt、getopt_long_only)(短选项 -,长选项 --)(option结构体)(optind、optarg变量)
  4. HDFS数据副本的摆放策略
  5. 启动项目后,FileItemFactory 错误
  6. 支持CDS view的SAP ALV IDA - 使用前提
  7. 5个构建Spring Boot API的实用技巧
  8. k均值算法 二分k均值算法_使用K均值对加勒比珊瑚礁进行分类
  9. idea中如何将一个普通项目转换为maven项目
  10. windows2003安全设置
  11. html背景图不显示_批量显示多张有序排列的图标,使用精灵图CSS Sprites这种办法...
  12. C++ STL set集合的使用
  13. 大数据分析具备哪些特点
  14. 基础算法(三)---二分排序(Java)
  15. 知识图谱从入门到应用——知识图谱的知识表示:向量表示方法
  16. 关于清华大学C语言门事件
  17. Unity做360度的全景照片
  18. matlab正序零序负序,正序负序零序的理解
  19. 【回归预测-FNN预测】基于粒子群优化前馈网络实现对婚姻和离婚数据回归预测附matlab代码
  20. intel芯片内核linux,Linux:再见了Intel 386处理器

热门文章

  1. 二级域名session共享php本地,PHP二级域名session共享方案
  2. html5画布可以p图,HTML5图像适合发布在画布上
  3. debian下安装LNMP(三)
  4. python【蓝桥杯vip练习题库】ALGO-50 数组查找及替换
  5. 【Network Security!】网络安全常用术语
  6. R语言中的esttab命令_R语言︱基本函数、统计量、常用操作函数
  7. 预计2021年电视出货量有所上涨,网络推广外包之下OLED大肆布局
  8. 企业网络推广浅析外包企业网络推广如何有效布局关键词优化?
  9. 企业网络推广——企业网络推广专员提高网站更新讲策略
  10. java cmd copy_使用Java中的cmd复制文件的问题