首页 > 代码库 > 最短路径问题
最短路径问题
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:5480
解决:1757
- 题目描述:
- 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
- 输入:
- 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
- 输出:
- 输出 一行有两个数, 最短距离及其花费。
- 来源:
- 2010年浙江大学计算机及软件工程研究生机试真题
1 #include <iostream> 2 using namespace std; 3 int INF=99999999; 4 5 struct lnode{ 6 int data; 7 int cost; 8 }; 9 10 lnode mx[1001][1001];11 12 int main()13 {14 int i,j;15 int n,m,a,b,dd,p,s,t;16 int v[1001],d[1001],c[1001];//v 是否访问过 d【i】 起点开始到i的最短距离 c【i】 花费17 18 19 while(cin>>n)20 {21 cin>>m;22 if(n==0 && m==0) break;23 for(i=1;i<=n;++i)24 for(j=1;j<=n;++j)25 mx[i][j].data=http://www.mamicode.com/mx[i][j].cost=INF;26 for(i=0;i<m;++i)27 {28 cin>>a>>b>>dd>>p;29 mx[a][b].data=http://www.mamicode.com/mx[b][a].data=dd;30 mx[a][b].cost=mx[b][a].cost=p;31 32 }33 cin>>s>>t;34 35 for(i=1;i<=n;++i) v[i]=0;36 37 38 for(i=1;i<=n;++i)39 c[i]=d[i]=(i==s?0:INF);//从s开始40 41 42 for(i=0;i<n;++i)43 {44 int x,m=INF;//选点45 for(j=1;j<=n;++j)46 if(!v[j] && d[j]<m) 47 {48 m=d[j];49 x=j;50 }51 52 v[x]=1;//入点53 54 55 for(j=1;j<=n;j++)//更新56 {57 if(d[j]>=d[x]+mx[x][j].data)58 {59 d[j]=d[x]+mx[x][j].data;60 if(c[j]>c[x]+mx[x][j].cost) 61 c[j]=c[x]+mx[x][j].cost;62 }63 }64 }65 cout<<d[t]<<" "<<c[t]<<endl;66 }67 return 0;68 }
最短路径问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。