PTA 5-7 城市间紧急救援 【Dijkstra+记录路径】
2017-03-04 15:37
357 查看
5-7 城市间紧急救援 (25分)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0
~ (N-1)(N−1);MM是快速道路的条数;SS是出发地的城市编号;DD是目的地的城市编号。
第二行给出NN个正整数,其中第ii个数是第ii个城市的救援队的数目,数字间以空格分隔。随后的MM行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出4个正整数NN、MM、SS、DD,其中NN(2\leN\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0
~ (N-1)(N−1);MM是快速道路的条数;SS是出发地的城市编号;DD是目的地的城市编号。
第二行给出NN个正整数,其中第ii个数是第ii个城市的救援队的数目,数字间以空格分隔。随后的MM行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。
输出格式:
第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从SS到DD的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。输入样例:
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> #include<cstdio> #include<math.h> #include<cstring> #include<climits> #include<string> #include<queue> #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<climits> #include<string> #include<queue> #include<stack> #include<set> #include<map> #include<list> #include<sstream> #include<algorithm> using namespace std; #define rep(i,j,k)for(i=j;i<k;i++) #define per(i,j,k)for(i=j;i>k;i--) #define MS(x,y)memset(x,y,sizeof(x)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ll long long #define abs(x) (x>0?x:-x) const int INF=0x7ffffff; const int M=1e4+10; int i,j,k,n,m; int d,s; int mp[M][M]; int vis[M],dis[M],val[M],cnt[M],pre[M],sum[M]; void init() { for(i=0;i<=n;i++){ pre[i]=-1; dis[i]=INF; for(j=0;j<=n;j++){ mp[i][j]=INF; if(i==j)mp[i][j]=0; } } MS(vis,0);MS(cnt,0);MS(sum,0); } void path(int d) { if(pre[d]!=-1){ path(pre[d]); printf("%d ",pre[d]); } } void Dijkstra() { vis[s]=1;sum[s]=val[s]; dis[s]=0;cnt[s]=1; for(i=0;i<n;i++){ int mink=s,minx=INF; for(j=0;j<n;j++){ if(!vis[j]&&dis[j]<minx) mink=j,minx=dis[j]; } vis[mink]=1; for(j=0;j<n;j++){ if(!vis[j]&&dis[j]>dis[mink]+mp[mink][j]){ dis[j]=dis[mink]+mp[mink][j]; pre[j]=mink; sum[j]=sum[mink]+val[j]; cnt[j]=cnt[mink]; } else if(!vis[j]&&dis[j]==dis[mink]+mp[mink][j]){ cnt[j]=cnt[mink]+cnt[j]; if(sum[j]<sum[mink]+val[j]){ sum[j]=sum[mink]+val[j]; pre[j]=mink; } } } } printf("%d %d\n",cnt[d],sum[d]); path(d); printf("%d\n",d); } int main() { while(~scanf("%d%d%d%d",&n,&m,&s,&d)){ for(i=0;i<n;i++)scanf("%d",&val[i]); init(); for(i=0;i<m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); if(c<mp[a][b])mp[a][b]=c,mp[b][a]=c; } Dijkstra(); } }
相关文章推荐
- hdu1595 find the longest of the shortest (dijkstra+记录路径)
- 【USACO14FEB】路障Roadblock Dijkstra+路径记录
- Dijkstra算法-单源最短路径(包括路径记录)
- uva 11374 最短路+记录路径 好题 dijkstra优先队列优化算法 邻接表法 可做模板 G++提交
- PTA-数据结构 5-35 城市间紧急救援 (25分)
- 20170813(两道题-dijkstra记录路径 BFS)
- hdu 1385 spfa和floyd,dijkstra记录最短最小字典序的路径
- poj2457 Part Acquisition(dijkstra||spfa+路径记录优化)
- dijkstra模板 pat 城市间紧急救援
- HDU-1595Find the longest of shortest(最短路径的最长路Dijkstra+记录路径)
- pat L2-001. 紧急救援 dijkstra变形+记录路径
- PAT L2-001. 紧急救援(Dijkstra + 记录路径)
- PAT L2-001. 紧急救援 Dijkstra+权值+路径记录
- POJ 2457 Part Acquisition (Dijkstra + 记录路径)
- dijkstra求最短路并记录路径
- PAT L2-001. 紧急救援 Dijkstra+权值+路径记录
- 紧急救援(Dijkstra+打印路径)
- PAT L2-001. 紧急救援 Dijkstra+权值+路径记录
- HDU ACM 3986 Harry Potter and the Final Battle(邻接表实现最短路dijkstra堆优化记录路径 + 枚举最短路上每条边)
- PAT L2-001. 紧急救援 Dijkstra+权值+路径记录