您的位置:首页 > 其它

PAT 天梯赛 L2-001. 紧急救援

2018-03-29 14:41 274 查看

L2-001. 紧急救援

时间限制200 ms
内存限制65536 kB
代码长度限制8000 B
判题程序Standard作者陈越
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。输入格式:输入第一行给出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
是一个最短路的问题
以前没写过这种题,看了题解才懂。
数组有点多,先写下数组的用处
int num[maxn]; //每个点的救援队
int path[maxn];//最优路径下当前这个点的前一个点
int way_cnt[maxn];//到该点的最短路的个数

int cnt[maxn];//最优路径下到该点的救援队数量#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
const int maxn=510;
const int inf=0x3f3f3f3f;
int map[maxn][maxn];
int dis[maxn];
bool vis[maxn];
int num[maxn];
int path[maxn];
int way_cnt[maxn];
int cnt[maxn];
int n,m,start,d;
void dijkstra()
{
memset(vis,false,sizeof(vis));
memset(way_cnt,0,sizeof(way_cnt));
memset(cnt,0,sizeof(cnt));
memset(path,-1,sizeof(path));
for(int i=0;i<n;i++)
{
dis[i]=map[start][i];
if(dis[i]!=inf&&start!=i)
{
way_cnt[i]=1;
cnt[i]=num[start]+num[i];
}
}
dis[start]=0;
vis[start]=true;
cnt[start]=num[start];
way_cnt[start]=1;
for(int i=0;i<n;i++)
{
int flag=start;
int minn=inf;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dis[j]<minn)
{
flag=j;
minn=dis[j];
}
}
vis[flag]=true;
for(int j=0;j<n;j++)
{
if(!vis[j])
{
if(dis[j]>dis[flag]+map[flag][j])
{
dis[j]=dis[flag]+map[flag][j];
way_cnt[j]=way_cnt[flag];
cnt[j]=cnt[flag]+num[j];
path[j]=flag;
}
else if(dis[j]==dis[flag]+map[flag][j])
{
way_cnt[j]+=way_cnt[flag];
if(cnt[flag]+num[j]>cnt[j])
{
cnt[j]=cnt[flag]+num[j];
path[j]=flag;
}
}
}
}
}
return;
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>n>>m>>start>>d;
for(int i=0;i<n;i++)
{
cin>>num[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
map[i][j]=(i==j?0:inf);
}
}
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
map[a][b]=map[b][a]=c;
}
dijkstra();
cout<<way_cnt[d]<<' '<<cnt[d]<<endl;
stack<int> sta;
int pos=d;
while(path[pos]!=-1)
{
sta.push(path[pos]);
pos=path[pos];
}
cout<<start<<' ';
while(!sta.empty())
{
cout<<sta.top()<<' ';
sta.pop();
}
cout<<d<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: