L2-001. 紧急救援【最短路+dfs】
2018-03-14 15:59
399 查看
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
思路:
先用最短路求出来到达终点的最短路,再用dfs搜索到达终点的最短路径及其条数,以及最短路中最大的军队数。可以加一个最优化剪枝。代码:
#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<vector> #include<ctype.h> #include<algorithm> using namespace std; #define inf 1<<29 int n,m,s,d,c[505],minlen; int G[505][505],dis[505],cnt,buf[505],ss,path[505],ans; bool vis[505]; void dijkstra() { memset(vis,0,sizeof vis); dis[s]=1; for(int i=0;i<n;i++) dis[i]=G[s][i]; for(int k=1;k<n;k++) { int minn=inf,tmp; for(int i=0;i<n;i++) if(!vis[i] && dis[i]<minn) minn=dis[tmp=i]; vis[tmp]=1; for(int i=0;i<n;i++) if(dis[i]>dis[tmp]+G[tmp][i]) dis[i]=dis[tmp]+G[tmp][i]; } minlen=dis[d]; } void dfs(int u,int len,int sum,int step) { buf[step]=u; if(len>minlen) return; if(u==d && len==minlen) { cnt++; if(sum>ans) { ans=sum; ss=step; memcpy(path,buf,sizeof buf); } return; } for(int i=0;i<n;i++) { if(!vis[i]) { vis[i]=1; dfs(i,len+G[u][i],sum+c[i],step+1); vis[i]=0; } } } int main() { scanf("%d%d%d%d",&n,&m,&s,&d); for(int i=0;i<n;i++) scanf("%d",&c[i]); for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i==j) G[i][j]=0; else G[i][j]=inf; for(int i=0;i<m;i++) { int u,v,l; scanf("%d%d%d",&u,&v,&l); if(l<G[u][v]) G[u][v]=G[v][u]=l; } dijkstra(); memset(vis,0,sizeof vis); cnt=0; ans=0; vis[s]=1; dfs(s,0,c[s],0); printf("%d %d\n",cnt,ans); for(int i=0;i<=ss;i++) { if(i) printf(" "); printf("%d",path[i]); } printf("\n"); return 0; }
相关文章推荐
- [PAT L2-001] 紧急救援(spfa,最短路计数, dp)
- CCCC - 天梯赛 - L2-001. 紧急救援 - 最短路(DJS)
- PAT L2-001 紧急救援 dijikstra 最短路
- 【天梯赛】L2-001. 紧急救援(dijkstra算法找最短路和最短路径数 + 输出路径)
- L2-001. 紧急救援(最短路dijkstra)
- PAT-L2-001. 紧急救援(最短路 dijkstar)
- L2-001. 紧急救援(最短路)
- L2-001. 紧急救援 SPFA+记录路径,统计最短路
- L2-001. 紧急救援(PAT 最短路+记录路径)
- L2-001. 紧急救援(最短路dij+路径记录)(模板)
- L2-001. 紧急救援(多级最短路 spfa)
- PAT L2-001. 紧急救援 (最短路变形 Dijkstra + 记录路径)
- 【最短路-spfa算法+dfs】L2-001. 紧急救援
- L2-001. 紧急救援 多条最短路 spfa/dijkstra
- 团体程序设计天梯赛L2-001 紧急救援(最短路)
- L2-001. 紧急救援 (最短路扩展)
- L2-001. 紧急救援 最短路
- L2-001紧急救援(最短路,路径,结点值)
- PAT ~ L2-001. 紧急救援 (最短路 + 最短路径条数 + 点权最大 + 路径输出)
- PAT天梯赛L2-001. 紧急救援 dijk经典最短路劲+点权最大+记录路径