博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
L2-001 紧急救援 (25 分)(Dijkstra求最短路)
阅读量:3898 次
发布时间:2019-05-23

本文共 1219 字,大约阅读时间需要 4 分钟。

【题目】

L2-001 紧急救援 (25 分)

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

输入格式:

输入第一行给出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 320 30 40 100 1 11 3 20 3 30 2 22 3 2

输出样例:

2 600 1 3

【题解】

思路:Dijkstra算法求最短路的过程中更新最短路径和最短路径的条数和最多集结救援队的数目。

【代码】

#include 
using namespace std;const int inf = 0x3f3f3f3f;int mp[505][505];int vis[505]={0}; //是否被选中int cou[505]={0}; //有多少条最短路径int sum[505]={0}; //最多能组织的救援队数目int pre[505];int a[505];int n,m,s,d;void dij(){ int dis[505]; for(int i=0;i
sum[j]){ sum[j]=sum[next]+a[j]; pre[j]=next; } } else if(dis[next]+mp[next][j]
stk; while(d!=s){ stk.push(d); d=pre[d]; } printf("%d",s); while(!stk.empty()){ printf(" %d",stk.top()); stk.pop(); } puts(""); return 0;}

 

转载地址:http://jbben.baihongyu.com/

你可能感兴趣的文章
CentOS7 安装配置FastDFS
查看>>
递归算法的时间复杂度
查看>>
数据结构之图(存储结构、遍历)
查看>>
使用sizeof计算类的大小
查看>>
乐观锁与悲观锁——解决并发问题
查看>>
operator 类型转换及重载
查看>>
HTTP状态码
查看>>
TCP/IP详解--举例明白发送/接收缓冲区、滑动窗口协议之间的关系
查看>>
TCP/IP详解--再次深入理解TCP网络编程中的send和recv
查看>>
TCP与UDP收发的时候TCP有缓冲区还是UDP有缓冲区,使用它们时该注意什么?
查看>>
C++中map、hash_map、unordered_map、unordered_set通俗辨析
查看>>
clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结
查看>>
运算符重载参数的顺序对运算是否有影响
查看>>
什么时候要用虚析构函数?
查看>>
序列化、反序列化与jsoncpp学习
查看>>
同步/异步与阻塞非阻塞的关系
查看>>
epoll模型讲解/源码分析
查看>>
ELF格式与bss段
查看>>
java继承 long和float小记点
查看>>
记录几点在开发中遇到的问题 2015-7-28 (会更新)
查看>>