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,表示若你在购买某商 ...
随机推荐
- odoo小数精确度
python round() 函数 Python用于四舍五入的内建函数round() ,它的定义为 意思是, 将 小数部分保留到 ndigits 指定的 小数位,也就是 精度保持到 ndigi ...
- Cocos2d-x 3.0 打造一个全平台概念文件夹
Cocos2d-x 3.0 打造一个全平台概念文件夹http:// www.eoeandroid.com/thread-328055-1-1.html
- hdoj 2188 悼念512汶川大地震遇难同胞——选拔志愿者 【巴什博弈】
题意:. . . 策略:最简单的典型的巴什博弈. 代码: #include<stdio.h> int main() { int n, m; int t; scanf("%d&qu ...
- do export method of oracle all database tables with dmp files.
usually we need to export the database tables to backup and others use. So we must know what to do e ...
- c语言知识点总结-------静态区、堆、栈、常量区等
在C语言中地址占4个字节 1.编程语言发展 低级语言----->高级语言 机器语言 ---> 汇编---->高级语言(C语言.C++.JAVA等) 机器语言 :0101 0010 1 ...
- C# trim split dataGrid
C#中Trim().TrimStart().TrimEnd()的用法: 这三个方法用于删除字符串头尾出现的某些字符.Trim()删除字符串头部及尾部出现的空格,删除的过程为从外到内,直到碰到一 ...
- C#XML的序列化与反序列化
要序列化的对象的类: [Serializable]public class Person{private string name;public string Name{get{return name; ...
- Linux 中权限的再讨论( 下 )
前言 上篇随笔讲述了Linux中权限的大致实现机制以及目录权限的相关规则.本文将讲解Linux中的三种特殊权限:SUID,SGID,Sticky权限.看完这两篇文章,你一定会对Linux的权限有个更深 ...
- 图像处理中的数学原理具体解释21——PCA实例与图像编码
欢迎关注我的博客专栏"图像处理中的数学原理具体解释" 全文文件夹请见 图像处理中的数学原理具体解释(总纲) http://blog.csdn.net/baimafujinji/ar ...
- IOS 单元测试
本文转载至 http://blog.csdn.net/fengsh998/article/details/8109293 IOS 自带单元测试. 1.在创建时,将include Unit Tests钩 ...