HDU 3790 最短路径问题
2017-10-11 21:07
393 查看
题目链接
题目意思
给你n个点,m条无向边,现在要从一个城市到另一个城市,要求最短路,如果最短路径有多条,就选花费最小的那条路。解题思路
这道题就是在模板题上稍微做一下修改即可,就是在判断最短路的时候如果最短路相同,就再判断一下最小花费即可。代码部分
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <queue> using namespace std; const int INF=99999; int a,b,d,p; int n,m; int dis[1010];///存储最短距离 int value[1010];///最小花费 int vis[1010];///标记数组 int map[1010][1010];///存储两点间的距离 int cost[1010][1010];///存储两点间的花费 void dijkstra(int u,int v) { int pos=u; for(int i=1; i<=n; i++) { dis[i]=map[u][i]; value[i]=cost[u][i]; } memset(vis,0,sizeof(vis)); vis[u]=1; for(int i=1; i<=n; i++) { int min=INF; for(int j=1; j<=n; j++) { if(!vis[j]&&min>dis[j]) { min=dis[j]; pos=j; } } vis[pos]=1; for(int j=1; j<=n; j++) { if(!vis[j]&&map[pos][j]<INF) { if(dis[j]>map[pos][j]+dis[pos]) { dis[j]=map[pos][j]+dis[pos]; value[j]=value[pos]+cost[pos][j]; } else if(dis[j]==map[pos][j]+dis[pos]) { if(value[j]>value[pos]+cost[pos][j]) value[j]=value[pos]+cost[pos][j]; } } } } printf("%d %d\n",dis[v],value[v]); } int main() { int st,ed; while(~scanf("%d%d",&n,&m),n+m) { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { map[i][j]=INF; cost[i][j]=INF; } for(int i=1; i<=m; i++) { scanf("%d%d%d%d",&a,&b,&d,&p); if(map[a][b]>d) { map[a][b]=map[b][a]=d; cost[a][b]=cost[b][a]=p; } else if(map[a][b]==d) { if(cost[a][b]>p) cost[a][b]=cost[b][a]=p; } } scanf("%d%d",&st,&ed); dijkstra(st,ed); } return 0; }
相关文章推荐
- HDU 3790 最短路径问题 (dijkstra+路长和权值)
- HDU 3790 最短路径问题
- HDU 3790 最短路径问题(Dijkstra)
- hdu 3790 最短路径问题
- HDU 3790 最短路径问题【多关键字最短路,Dijkstra算法+spfa算法】
- 九度1008&&HDU - 3790:最短路径问题 (最短路径dijkstra)
- hdu-3790-最短路径问题(dijkstra算法)
- HDU 3790 ——最短路径问题 以边表为数据结构的BF算法&双重权值
- HDU 3790 最短路径问题
- HDU 3790 最短路径问题
- hdu 3790 最短路径问题
- HDU 3790 最短路径问题 (dijkstra+路长和权值)
- hdu 3790 最短路径问题(距离和费用)
- hdu_3790 最短路径问题
- hdu 3790 最短路径问题
- 最短路径问题 HDU 3790
- hdu 3790 最短路径问题(Dijkstra多条件判断)
- HDU 3790 最短路径问题【最短路 dijkstra 双权值】
- HDU-3790 最短路径问题(双重权值)
- hdu-3790最短路径问题