最短路径问题--比较综合的一道题
2016-08-09 21:15
253 查看
复习最短路径问题,发现杭电acm-3790这道题目比较典型,就练习了下。开始调试时一直报错,后来加了87-91行,竟然就accepted,可能还是题意没完全理解清楚吧。特地记录下来,代码如下:
#include #define MAX 1001 #define INF 65535 typedef struct cost { int d;//距离 int p;//花费 }cost; cost map[MAX][MAX]; void calculate(cost map[MAX][MAX],cost D[MAX],int P[MAX],int flag[MAX],int n,int s) { for(int i=1;iD[j].p) { continue; } } D[j].d=min.d+map[k][j].d; D[j].p=min.p+map[k][j].p; P[j]=k; } } } } int main() { int n,m; while(~scanf("%d%d",&n,&m))//输入n,m { if(n==0 && m==0)//退出 { break; } int loop=m; for(int i=0;i<=n;i++)//初始化数组 { for(int j=0;j<=n;j++) { if(i==j) { map[i][j].d=0; map[i][j].p=0; map[j][i]=map[i][j]; continue; } map[i][j].d=INF; map[i][j].p=INF; map[j][i]=map[i][j]; } } int a,b,d,p,s,t; while(loop--) { scanf("%d%d%d%d",&a,&b,&d,&p); if(map[a][b].d>d) { map[a][b].d=d; map[a][b].p=p; map[b][a]=map[a][b]; } else if(map[a][b].d==d) { if(map[a][b].p>p) map[a][b].p=map[b][a].p=p; } } scanf("%d%d",&s,&t); int P[MAX],flag[MAX];//P-前一路径 cost D[MAX];//D-最小值 for(int i=0;i<=n;i++) { D[i].d=map[s][i].d; D[i].p=map[s][i].p; } for(int i=0;i<=n;i++) { P[i]=s; } for(int i=0;i<=n;i++) { flag[i]=0; } flag[s]=1; calculate(map,D,P,flag,n,s); printf("%d %d\n",D[t].d,D[t].p); } return 0; }
相关文章推荐
- 最短路径问题 Floyd SPFA Dijkstra 效率比较
- .NET进期综合---缓存/关于跨页面值传递/页面设置CSS/用户自定义控件/fileupload的路径问题/dropdown二级联动的数据库设计
- 具有障碍物的欧几里德最短路径问题
- 两个城市之间寻找最短路径问题(广度优先搜索)
- 求含有负权边的图的单源最短路径——Bellman Ford算法与SPFA算法综合分析
- 最短路径问题
- Dijkstra算法是解单源最短路径问题的一个贪心算法
- 点对的最短路径问题
- 最短路径问题的延伸
- Dijstra算法实现求解单源最短路径问题
- 单源最短路径问题
- 图::最短路径问题
- 单源加权图最短路径问题2-BellmanFord算法
- 单源加权图最短路径问题(权值非负)-Dijkstra算法
- 关于最短源路径问题
- 动态规划解最短路径问题
- 最短带权路径问题的解法::Dijkstra & Floyd
- 单源无权最短路径举例——字梯问题
- 最短路径问题
- 最短路径问题