城市间紧急救援(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时间差(Timedelta)
时间差(Timedelta)是时间上的差异,以不同的单位来表示.例如:日,小时,分钟,秒.它们可以是正值,也可以是负值.可以使用各种参数创建Timedelta对象,如下所示 - 字符串 通过传递字符串 ...
- Java多线程 - Callable和Future
已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与r ...
- js关闭浏览器窗口及检查浏览器关闭事件
js关闭浏览器窗口,不弹出提示框.支持ie6+,火狐,谷歌等浏览器,下面以一个示例为大家详细介绍下具体的实现方法,感兴趣的朋友可以参考下 js关闭浏览器窗口 js关闭浏览器窗口,不弹出提示框.支持 ...
- nyoj-5-kmp裸题
题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=5 kmp统计匹配串出现次数,贼尴尬好久没做字符串题目,一开始求得是文本串的next ...
- 亲测安装nginx1.8.1 日期2016年3月16日
1.安装nginx tar zxvf nginx-1.8.1.tar.gz cd nginx-1.8.1 ./configure make make install /usr/local/nginx/ ...
- HTML 中 id与name 区别
一个name可以同时对应多个控件,比如checkbox和radio而id必须是全文档中唯一的 id的用途1) id是HTML元素的Identity,主要是在客户端脚本里用.2) label与form控 ...
- SpringMVC中WebDataBinder的应用及原理
Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型.若这个普通Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数.众所周 ...
- 15 分钟学会 Eclipse GMF
背景 坦白说:过去在 Eclipse 里使用 Graphical Editor Framework(GEF)创建图形化编辑器 既慢又痛苦.这个过程包括理解复杂的框架和大量的冗余代码.但也说明 GEF ...
- Spring Boot下如何自定义Repository中的DAO方法
环境配置介绍 jdk 1.8, Spring Boot 1.5.3.RELEASE, Mysql, Spring Data, JPA 问题描述 Spring Data提供了一套简单易用的DAO层抽象与 ...
- GoogLeNet 神经网络结构
GoogLeNet是2014年 ILSVRC 冠军模型,top-5 错误率 6.7% ,GoogLeNet做了更大胆的网络上的尝试而不像vgg继承了lenet以及alexnet的一些框架,该模型虽然有 ...