城市间紧急救援(25 分)(dijstra变形)
城市间紧急救援(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
#include "iostream"
using namespace std; #define Max 500
#define Sky 99999
int Graph[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]=Graph[Start][i];
Move[i]=false;
if(i!=Start && Graph[Start][i]!=Sky)
{
Sum[i]=Peo[Start]+Peo[i];
Way[i]=;
}
}
Dist[Start]=;
Move[Start]=true;
Sum[Start]=Peo[Start];
Way[Start]=; for(i=;i<=Top-;i++)
{
int minw,maxp;
minw=maxp=Sky;
int k=Start; for(j=;j<Top;j++)
{
if(!Move[j])
{
if(minw>Dist[j])
{
minw=Dist[j];
k=j;
maxp=Sum[j];
}
if(minw==Dist[j] && maxp<Sum[j])
{
maxp=Sum[j];
k=j;
}
}
} Move[k]=true; for(j=;j<Top;j++)
{
if(!Move[j])
{
if(Dist[j]==Dist[k]+Graph[k][j])
{
Way[j]+=Way[k];
if(Sum[j]<Sum[k]+Peo[j])
{
Sum[j]=Sum[k]+Peo[j];
}
}
if(Dist[j]>Dist[k]+Graph[k][j])
{
Dist[j]=Dist[k]+Graph[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]-Graph[end][j]==Dist[j])
{
Dfs(j,Sum[j]);
cout<<j<<" ";
}
} }
int main( )
{ //freopen("1.txt","r",stdin);
cin>>Top>>Edge>>Start>>End;
int i,j;
for(i=;i<Top;i++)
for(j=;j<Top;j++)
Graph[i][j]=Sky; for(i=;i<Top;i++)
cin>>Peo[i]; for(i=;i<Edge;i++)
{
int x,y,z;
cin>>x>>y>>z;
Graph[x][y]=Graph[y][x]=z;
}
Dis();
cout<<Way[End]<<" "<<Sum[End]<<endl; Dfs(End,Sum[End]);
cout<<End<<endl; return ;
}
- #include "iostream"
- using namespace std;
- #define Max 500
- #define Sky 99999
- int Graph[Max][Max],Top,Start,End,Edge;
- int Dist[Max],Move[Max],Peo[Max],Sum[Max],Way[Max];
- void Dis()
- {
- int i,j;
- for(i=0;i<Top;i++)
- {
- Dist[i]=Graph[Start][i];
- Move[i]=false;
- if(i!=Start && Graph[Start][i]!=Sky)
- {
- Sum[i]=Peo[Start]+Peo[i];
- Way[i]=1;
- }
- }
- Dist[Start]=0;
- Move[Start]=true;
- Sum[Start]=Peo[Start];
- Way[Start]=1;
- for(i=1;i<=Top-2;i++)
- {
- int minw,maxp;
- minw=maxp=Sky;
- int k=Start;
- for(j=0;j<Top;j++)
- {
- if(!Move[j])
- {
- if(minw>Dist[j])
- {
- minw=Dist[j];
- k=j;
- maxp=Sum[j];
- }
- if(minw==Dist[j] && maxp<Sum[j])
- {
- maxp=Sum[j];
- k=j;
- }
- }
- }
- Move[k]=true;
- for(j=0;j<Top;j++)
- {
- if(!Move[j])
- {
- if(Dist[j]==Dist[k]+Graph[k][j])
- {
- Way[j]+=Way[k];
- if(Sum[j]<Sum[k]+Peo[j])
- {
- Sum[j]=Sum[k]+Peo[j];
- }
- }
- if(Dist[j]>Dist[k]+Graph[k][j])
- {
- Dist[j]=Dist[k]+Graph[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=0;j<Top;j++)
- {
- if(Sump-Peo[end]==Sum[j] && Dist[end]-Graph[end][j]==Dist[j])
- {
- Dfs(j,Sum[j]);
- cout<<j<<" ";
- }
- }
- }
- int main( )
- {
- //freopen("1.txt","r",stdin);
- cin>>Top>>Edge>>Start>>End;
- int i,j;
- for(i=0;i<Top;i++)
- for(j=0;j<Top;j++)
- Graph[i][j]=Sky;
- for(i=0;i<Top;i++)
- cin>>Peo[i];
- for(i=0;i<Edge;i++)
- {
- int x,y,z;
- cin>>x>>y>>z;
- Graph[x][y]=Graph[y][x]=z;
- }
- Dis();
- cout<<Way[End]<<" "<<Sum[End]<<endl;
- Dfs(End,Sum[End]);
- cout<<End<<endl;
- return 0;
- }
城市间紧急救援(25 分)(dijstra变形)的更多相关文章
- 5-5 城市间紧急救援 (25分)【最短路spfa】
5-5 城市间紧急救援 (25分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速 ...
- PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)
PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...
- PTA-数据结构 Dijkstra 城市间紧急救援
城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...
- 天梯L2-001. 紧急救援(25分)
L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...
- 城市间紧急救援 Dijkstra
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...
- L2-001 紧急救援 (25 分)
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...
- PAT 甲级1003 Emergency (25)(25 分)(Dikjstra,也可以自己到自己!)
As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...
- PTA 旅游规划(25 分)
7-10 旅游规划(25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条 ...
- L2-013 红色警报 (25 分)
L2-013 红色警报 (25 分) 战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全 ...
随机推荐
- Pandas窗口函数
为了处理数字数据,Pandas提供了几个变体,如滚动,展开和指数移动窗口统计的权重. 其中包括总和,均值,中位数,方差,协方差,相关性等. 下来学习如何在DataFrame对象上应用上提及的每种方法. ...
- Linux常用命令.rpm
1.安装: rpm -ivh 包全名(查询依赖网址:http://www.rpmfind.net) -i(install):安装 -v(verbose):显示详细信息 -h(hash):显示进度 -- ...
- Cassandra 的数据存储结构——本质是SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>
Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型.它借鉴了 Amazon 的 Dynamo 和 Google's BigTab ...
- 【.Net】Socket小示例
引言 项目中用到了Socket,这里做个控制台小示例记录一下. Client 客户端的Receive用了异步方法,保持长连接,可以随时发送消息和响应服务端的消息,如下 static string Cl ...
- hibernate框架环境搭建与使用
搭建环境 一.新建一个项目 , 导包 一个是hibernate的jar包,一个是jdbc的jar包 hibernate的jar包 这些jar包全部导入 二.配置Hibernate. 1.建立hib ...
- zoj 3212 K-Nice(构造)
K-Nice Time Limit: 1 Second Memory Limit: 32768 KB Special Judge This is a super simple pr ...
- Database项目中关于Procedure sp_refreshsqlmodule_internal的错误
最近项目中发现一怪问题,使用DB项目发布数据库时,总提示 “(110,1): SQL72014: .Net SqlClient Data Provider: Msg 1222, Level 16, S ...
- ios上传图片遇见了一个TimeoutError(DOM Exception 23)异常
TimeoutError(DOM Exception 23):The operation timed out 百度了下,没发现解决办法
- spring 多数据源动态切换
理解spring动态切换数据源,需要对spring具有一定的了解 工作中经常遇到读写分离,数据源切换的问题,那么以下是本作者实际工作中编写的代码 与大家分享一下! 1.定义注解 DataSource ...
- js 取任意两个数之间的随机整数
function getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Mat ...