HDU 3790 最短路径问题(dijkstra)
2017-08-16 23:40
393 查看
最短路径问题[b]Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 29120 Accepted Submission(s): 8657 [/b] [align=left]Problem Description[/align] 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 [align=left]Input[/align] 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。 (1<n<=1000, 0<m<100000, s != t) [align=left]Output[/align] 输出 一行有两个数, 最短距离及其花费。 [align=left]Sample Input[/align] 3 2 1 2 5 6 2 3 4 5 1 3 0 0 [align=left]Sample Output[/align] 9 11最短路(dijkstra算法)相比于模板这道题需要建立一个计算花费的二维数组me[i][j]与储存路劲的map[i][j]对应表示i到j所需要的花费,用sum[i]来储存当前到i所要用的最小的花费这样的话花费的状态转移方程为:if(minload[i]==map[start][i]+minload[start])//题目要求路线优先考虑sump[i]=min(sum[i],sum[start]+me[start][i])最短路径的思路可以用到求最小花费需要注意的是路径重复时候需要选择路径短的在改变路径短的时候花费也要改变
#include <stdio.h> #include<algorithm> #include<string.h> #include<math.h> #define inf 9999999 int minload[1001],map[1001][1001],visit[1001]; int me[1001][1001]; int sum[1001]; using namespace std; int main(int argc, char *argv[]) { int i,j,m,n; while(scanf("%d %d",&n,&m),n+m) { for(i=1;i<=n;i++) { minload[i]=inf; sum[i]=inf; visit[i]=1; for(j=1;j<=n;j++) { map[i][j]=inf; me[i][j]=inf; } } int a,d,b,p; for(i=0;i<m;i++) { scanf("%d %d %d %d",&a,&b,&d,&p); if(map[a][b]>d) { map[a][b]=map[b][a]=d; me[a][b]=me[b][a]=p; } if(map[a][b]==d&&me[a][b]>p) { me[a][b]=me[b][a]=p; } } int chun,start,target; scanf("%d %d",&start,&target); minload[start]=0; sum[start]=0; while(start!=target) { int min1=inf; for(i=1;i<=n;i++) { if(map[start][i]!=inf) { if(minload[i]>map[start][i]+minload[start]) { minload[i]=map[start][i]+minload[start]; sum[i]=sum[start]+me[start][i]; } if(minload[i]==map[start][i]+minload[start]) { sum[i]=min(sum[i],sum[start]+me[start][i]); } } if(visit[i]&&min1>minload[i]) { chun=i; min1=minload[i]; } } visit[chun]=0; start=chun; } printf("%d %d\n",minload[target],sum[target]); } return 0; } |
相关文章推荐
- HDU - 3790 最短路径问题(Dijkstra)
- HDU 3790 最短路径问题 (dijkstra+路长和权值)
- HDU 3790 最短路径问题【Dijkstra】
- hdu 3790 最短路径问题(dijkstra)
- HDU-3790 最短路径问题 (Dijkstra)
- 九度1008&&HDU - 3790:最短路径问题 (最短路径dijkstra)
- HDU 3790 最短路径问题 裸跑dijkstra
- HDU -- 3790 最短路径问题 (Dijkstra+priority_queue)
- hdu 3790 最短路径问题(Dijkstra多条件判断)
- HDU 3790 - 最短路径问题(优化Dijkstra)
- HDU 3790 最短路径问题(Dijkstra)
- hdu-3790-最短路径问题(Dijkstra)
- HDU - 3790 最短路径问题Dijkstra
- hdu 3790 最短路径问题(dijkstra加强版)
- HDU 3790 最短路径问题 Dijkstra
- hdu 3790 最短路径问题(Dijkstra)
- HDU 3790 最短路径问题【最短路 dijkstra 双权值】
- HDU 3790:最短路径问题【Dijkstra】
- hdu 3790 最短路径问题(Dijkstra)
- hdu 3790 (最短路径问题dijkstra)