城市间紧急救援(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 分) 战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全 ...
随机推荐
- Shell中find中的atime、ctime、mtime的区别
Shell中find中的atime.ctime.mtime的区别 find用法: -atime n File was last accessed n*24 hours ago. 访问(读取文件或执行文 ...
- java-给微信推送消息 利用企业微信
目的:给关注用户推送消息 场景:自动化测试,运维监控,接口访问等报错预警.例如线上接口报错,发送提醒消息 准备工作: 1:注册企业号(为什么不用公众号呢?) 企业号注册 2:常用参数介绍: 1:COR ...
- netty的异常分析 IllegalReferenceCountException refCnt: 0
netty的异常 IllegalReferenceCountException refCnt: 0 这是因为Netty有引用计数器的原因,自从Netty 4开始,对象的生命周期由它们的引用计数(ref ...
- hdu 5974 A Simple Math Problem
A Simple Math Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- jvm最大线程数
摘自:http://sesame.iteye.com/blog/622670 工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. ...
- LeetCode OJ:Binary Tree Postorder Traversal(后序遍历二叉树)
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...
- Agilent RF fundamentals (8) Oscillator Decisions
----------------------
- Pro Android学习笔记 ActionBar(1):Home图标区
Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...
- Unity 2D 入门
原文:Introduction to Unity 2D 作者:Sean Duffy 译者:kmyhy 3/15/17 更新说明: 升级至 Unity 5.5. Unity 是一个非常流行和强大的游戏引 ...
- Photoshop脚本指南——Hello World
作为一个程序猿,每一个东西的学习都是从Hello World开始的,从今天开始,让我们一起进入Photoshop脚本的世界,并以Hello World开始我们的旅程. 1.简介 Photoshop支持 ...