城市间紧急救援(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 分) 战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全 ...
随机推荐
- js中object的copy
一.场景 在js中一个对象(Object)或者是一个数组(Array)在复制的过程中往往不是特别的简单,一般情况下我们会直接将其赋值给另外一个变量名下,就像这样: var a = [1,2,3]; v ...
- JDBC相关总结
JDBC statement的相关总结 1.Statement.PreparedStatement和CallableStatement都是接口(interface). 2.Statement继承自Wr ...
- C#和Java接口对比
C#和java的接口有很多类似之处,对于编程约束和设计模式的实现有重要作用.这里记录几个知识点. 1. C#的接口中不能有字段,但Java的接口中允许有static final修饰的字段/域(fiel ...
- 51nod1293 dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1293 1293 球与切换器 题目来源: Codility 基准时间限制: ...
- JavaScript中的两个“0” -0和+0
JavaScript中的两个“0”(翻译) 本文翻译自JavaScript’s two zeros JavaScript has two zeros: −0 and +0. This post e ...
- IOS-环信
一.即时通讯 即时通讯,又称实时通讯 即时通信(Instant Messaging,简称IM)是一个实时通信系统,允许两人或多人使用网络实时的传递文字消息.文件.语音与视频交流 即时通讯在开发中使用的 ...
- while for if ---语句和编写计划任务
关于while循环: while do done 例如 1.关于内存的实时操作: (1).vim a.sh (2).输入以下while循环 (3)../a.sh执行脚本 2.自加一的操作: (1).v ...
- L140
一本载有许多时装照片的杂志是用带有光泽的优质纸印制的.A glossy magazine has lots of pictures of fashionable clothes and is prin ...
- Myeclipse10 安装Aptana插件
安装步骤: 1.下载aptana3.2 Eclipse Plugin插件. 下载地址:http://update1.aptana.org/studio/3.2/024747/index.html 2. ...
- 持久层框架:MyBatis 3.2(2)
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得.SqlSessi ...