城市间紧急救援(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 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 代码及分析如下:
 /*

 目标:
求最短路径长度和条数以及最短路径下的最多救援队数。(优先选择距离最短的路径,距离相同考虑救援队数量)
代码解释:
Way数组:Way【i】从出发点到i点的最短路径的数量
Sum数组:Sum【i】从出发点到i点的一条或多条最短路径下的救援队数量最多的路径的救援队数量
Peo数组:Peo【i】代表下表为i的点的初始救援队个数
Move数组:Move【i】若为true代表小标为i的点已经被访问过了,为false则没有;
Dist数组:Dist【i】代表从出发点到i点的最短距离
思路:
基本的最短路问题(这里选择迪杰斯特拉,注意它不能解决负权边问题)
除此之外为了解决最短路径条数和最短路下的最大救援队数量引入Way数组和Sum数组
递推公式
Way【i】=ΣWay【j】(j为使得Dist【i】最小的i点的前驱,可能有多个),显然边界条件Way【s】=1(s为出发点);
Sum【i】= Sum【j】+Peo【i】(j为最短路上i的前驱)
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define Max 500
#define Sky 99999 //表示两点之间没有路径时的距离
int distances[Max][Max],Top,Start,End,Edge; //分别为 两城市间距离的二维数组 城市个数 起点 终点 边数
int Dist[Max],Move[Max],Peo[Max],Sum[Max],Way[Max];
void Dis()
{
int i,j;
//初始化边界条件
for(i=;i<Top;i++)
{
Dist[i]=distances[Start][i]; //把最短距离初始化为起点到该点的直接距离
Move[i]=false; //每个点初始化为都没有访问
}
Dist[Start]=; //起点到本身距离为零
Move[Start]=true; //起点已经被访问
Sum[Start]=Peo[Start]; //团队数仅为起点团队数
Way[Start]=; //路径条数为1 for(i=;i<=Top-;i++) //除了起点还要循环top-1 次才能完成所有定点的访问
{
int minw=Sky; //保存距离出发点最近的点距离出发点的距离,初始化为最大
int k; //保存该点的编号
for(j=;j<Top;j++)//遍历每一个顶点
{
if(!Move[j]) //j没有被访问的话
{
if(minw>Dist[j])//如果找到距离出发点更近的点,更新minw和k
{
minw=Dist[j];
k=j;
}
}
} Move[k]=true; //更新过的k顶点处理完毕 标记数组为true for(j=;j<Top;j++)//遍历每一个顶点
{
if(!Move[j])//如果没有访问(处理完毕)
{
if(Dist[j]==Dist[k]+distances[k][j])/*如果从起点到下标j点的距离等于从起点先到k再到j的距离*/
{
Way[j]+=Way[k];//加和
if(Sum[j]<Sum[k]+Peo[j])//路径距离相同时,团队数更多
{
Sum[j]=Sum[k]+Peo[j];//团队数更新
}
}
if(Dist[j]>Dist[k]+distances[k][j])/* 如果从起点到下标j点的距离等于从起点先到k再到j的距离*/
{
Dist[j]=Dist[k]+distances[k][j];
Sum[j]=Sum[k]+Peo[j];
Way[j]=Way[k];
} }
}
}
}
void Dfs(int end,int Sump)
{
if(end==Start)//边界条件
{
return;
}
for(int j=;j<Top;j++)//遍历每一个顶点
{
if(Sump-Peo[end]==Sum[j] && Dist[end]-distances[end][j]==Dist[j])/*寻找当前点的前驱点*/
{
Dfs(j,Sum[j]);
cout<<j<<"";
}
} }
int main( )
{
cin>>Top>>Edge>>Start>>End;
int i,j;
for(i=;i<Top;i++)
for(j=;j<Top;j++)
distances[i][j]=Sky; for(i=;i<Top;i++)
{
scanf("%d",&Peo[i]);
} for(i=;i<Edge;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
distances[x][y]=distances[y][x]=z;//存入直接相连城市间的距离z
}
Dis();
cout<<Way[End]<<""<<Sum[End]<<endl; Dfs(End,Sum[End]);
cout<<End<<endl; return ;
}
坚持不懈地努力才能成为大神!

PTA-数据结构 Dijkstra 城市间紧急救援的更多相关文章

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

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

  2. 城市间紧急救援(25 分)(dijstra变形)

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

  3. 5-5 城市间紧急救援 (25分)【最短路spfa】

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

  4. 城市间紧急救援 Dijkstra

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

  5. PTA数据结构与算法题目集(中文) 7-9

    PTA数据结构与算法题目集(中文)  7-9 7-9 旅游规划 (25 分)   有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游 ...

  6. PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分)   给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...

  7. PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分)   给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...

  8. PTA数据结构与算法题目集(中文) 7-40奥运排行榜 (25 分)

    PTA数据结构与算法题目集(中文)  7-40奥运排行榜 (25 分) 7-40 奥运排行榜 (25 分)   每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同.比如 ...

  9. PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分)

    PTA数据结构与算法题目集(中文)  7-39魔法优惠券 (25 分) 7-39 魔法优惠券 (25 分)   在火星上有个魔法商店,提供魔法优惠券.每个优惠劵上印有一个整数面值K,表示若你在购买某商 ...

随机推荐

  1. class文件结构浅析(2)

    欢迎转载,转载需声明出处 ------------------ 请先看上一篇:Class类文件结构浅析 上一篇讲的都是理论.以下我们亲自实践一下. 首先编写一个简单的java类: public cla ...

  2. mt-datetime-picker type="date" 时间格式 bug

    1.mint-ui 中 mt-datetime-picker 组件,存在日期格式 bug <!-- 日期选择器 --> <template> <div class=&qu ...

  3. POJ 2309 BST

    BST Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8565   Accepted: 5202 Description C ...

  4. ubuntu环境准备

    一. 桌面方面看起来比较不爽,12的版本用起更不习惯,决定改成命令行登陆 a. vi  /ect/default/grub 文件 b. 修改成第二个红框的情况 c. 执行update-grub命令 d ...

  5. 常见Struts、Hibernate、Spring、J2EE、ibatis、Oracle等开发框架架构图及其简介

    各种系统架构图及其简介 转载请保留出处,不胜人生一场醉汇总. 以下文字和架构图均在本人相关系统设计和架构方案中有所应用. 原文出处:http://space.itpub.net/6517/viewsp ...

  6. 02 php生成xml数据

    <?php class Response_xml{ /** *按xml方式输出通信 *@param integet $code 状态码 *@param string $message 提示信息 ...

  7. 使用jquery datatables插件遇到fnReloadAjax的问题

    1 官网地址:http://www.datatables.net/ 2 基本参数介绍 http://blog.csdn.net/mickey_miki/article/details/8240477 ...

  8. 网络直播流媒体协议的选择讨论,RTSP,RTMP,HTTP,私有协议?

    最近有不少人在EasyDarwin的交流群里面问关于花椒.映客手机直播技术的问题,还有RTSP.RTMP协议选择的问题,这里个人谈一下自己的愚见. 1.不管是RTSP/RTP.RTMP.HTTP,亦或 ...

  9. HDFS HBase Solr Which one?

    从访问模式角度决策 HDFS 压缩性能最优.扫描速度最快:不支持随机访问,仅支持昂贵.复杂的文件查询 HBase适合随机访问 Solr 适合检索需求 HBase访问单个记录的时间为毫秒级别,而HDFS ...

  10. Java中实现函数的阻塞

    使用Object.wait()即可实现阻塞,使用Object.notify()解除阻塞,代码示例如下 MainFrame.java import javax.swing.JFrame; import ...