PTA-数据结构 Dijkstra 城市间紧急救援
城市间紧急救援(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 城市间紧急救援的更多相关文章
- PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)
PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...
- 城市间紧急救援(25 分)(dijstra变形)
城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...
- 5-5 城市间紧急救援 (25分)【最短路spfa】
5-5 城市间紧急救援 (25分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速 ...
- 城市间紧急救援 Dijkstra
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...
- PTA数据结构与算法题目集(中文) 7-9
PTA数据结构与算法题目集(中文) 7-9 7-9 旅游规划 (25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游 ...
- PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...
- PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分) 给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...
- PTA数据结构与算法题目集(中文) 7-40奥运排行榜 (25 分)
PTA数据结构与算法题目集(中文) 7-40奥运排行榜 (25 分) 7-40 奥运排行榜 (25 分) 每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同.比如 ...
- PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分)
PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分) 7-39 魔法优惠券 (25 分) 在火星上有个魔法商店,提供魔法优惠券.每个优惠劵上印有一个整数面值K,表示若你在购买某商 ...
随机推荐
- 如何用迅雷下载在网页中的Flash动画或课件
对于框架网页而言,看地址栏可以发现后缀不是SWF,就是说该网站没有直接把Flash给你,右击该Flash也没有下载选项. 此时虽然右下角是Flash,但是左边和上面网页部分还是正常的元素,右击这些 ...
- solaris用户与文件权限管理
此文章已于 20:45:28 2015/3/22 重新发布到 zhuxuekui3 solaris用户与文件权限管理1 类别 「网站分类」Oracle 一.用户与用户组管理 三种用户:超级用户. ...
- android实例讲解----Tomcat部署Web应用方法总结
参考文档:http://blog.csdn.net/yangxueyong/article/details/6130065 Tomcat部署Web应用方法总结 一.架构介 ...
- python(11)- 文件处理
文件操作 1.1 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧明 ...
- gulp-gulpfile.js语法说明
关于gulpfile文件: 直接上代码吧!! /*! * gulp * $ npm install gulp gulp-ruby-sass gulp-cached gulp-uglify gulp-r ...
- win7自带照片查看器
win10如何找回自带的照片查看器 方法/步骤 1 首先,我们打开一个记事本,可以点击win+r打开运行框,然后在运行框中输入notepad.或者在桌面右键点击里面的新建,然后在新建中找到文本 ...
- Java获取本机MAC地址[转]
原文地址:https://www.cnblogs.com/hxsyl/p/3422191.html Java获取本机MAC地址 为什么写这个呢?因为前几天看见网上有采用windows命令获取局域网 ...
- 基于django做增删改查组件,分页器组件
增删改查组件 一.Djangoadmin的启发 二.基于Djangoadmin实现数据的增删改查 分页器组件 分页器组件的介绍以及源码解读 补充:源码下载,
- 图像处理之opencv---加减乘除运算cvdiv
http://chyyeng.blog.163.com/blog/static/16918230201211632135456/
- 使用MSSQL同步&发布数据库快照遇到错误:对路径“xxxxx”访问被拒绝的解决方法
使用MSSQL同步 数据库同步做后后测试:先在同步那台服务器(服务器A)数据库里修改里面数据库,然后再去被同步那台服务器(服务器B)看下数据有没被同步过去 发布数据库快照遇到错误:对路径“xxxxx” ...