最短路径问题
来源:互联网 发布:seo蜘蛛精有什么用 编辑:程序博客网 时间:2024/05/13 18:17
最短路径问题Crawling in process...Crawling failedTime Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
Input
输入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)
(1<n<=1000, 0<m<100000, s != t)
Output
输出 一行有两个数, 最短距离及其花费。
Sample Input
3 21 2 5 62 3 4 51 30 0
Sample Output
9 11#include <stdio.h>#include<string.h>#include<stdlib.h>#define inf 99999999int map[10010][10010];int cost[10010][10010];int dis[1010];int mon[1010];int vis[1010];int s,e;void dijkstra(int n){ int i,j,k; int min; for(i=1; i<=n; i++) { dis[i]=map[i][s]; mon[i]=cost[i][s]; } vis[s]=1; for(i=1;i<=n;i++) { k=s; min=inf; for(j=1;j<=n;j++) { if(dis[j]<min&&!vis[j]) { k=j; min=dis[k]; } } vis[k]=1; for(j=1;j<=n; j++) { if(!vis[j]) { if(dis[j]>dis[k]+map[j][k]) { dis[j]=map[j][k]+dis[k]; mon[j]=mon[k]+cost[j][k]; } else if(dis[j]==dis[k]+map[j][k]&&mon[j]>mon[k]+cost[j][k]) mon[j]=mon[k]+cost[j][k]; } } }}int main(){ int n,m,i,j; int a,b,d,p; while(~scanf("%d %d",&n,&m)) { if(n==0&&m==0) break; memset(vis,0,sizeof(vis)); for(i=1; i<=n; i++) for(j=1; j<=n; j++) { if(i!=j) map[i][j]=inf; else map[i][j]=0; } for(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; } } scanf("%d%d",&s,&e); dijkstra(n); if(dis[e]!=inf) printf("%d %d\n",dis[e],mon[e]); } return 0;}
0 0
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- 最短路径问题
- Android(java方法)上实现mp4的分割和拼接 (二)
- Shader
- Mali GPU OpenGL ES 应用性能优化--基本方法
- PostgreSQL的 pg_hba.conf 文件简析
- poj-3614-Sunscreen
- 最短路径问题
- C++设计模式-Observer观察者模式
- Android:SQLite的使用方法
- 中国好声音
- IOS开源项目汇总
- JAVA NIO 简介
- C++设计模式-Memento备忘录模式
- Ubuntu下 git 使用
- 2.2-找链表倒数第k个(same in LeetCode)