九度oj 1008 最短路径问题 2010年浙江大学计算机及软件工程研究生机试真题

题目1008:最短路径问题

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:6794

解决:2209

题目描述:
给你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)
输出:
输出 一行有两个数, 最短距离及其花费。
样例输入:
3 2
1 2 5 6
2 3 4 5
1 3
0 0
样例输出:
9 11
来源:
2010年浙江大学计算机及软件工程研究生机试真题
分析:
最短路径dijkstra算法
 1 #include <cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string>
 5 #include<cstring>
 6 #include<vector>
 7 using namespace std;
 8 struct point{
 9     int dis,cost;
10 };
11 point p[1005];
12 int map[1005][1005][2];
13 #define inf 999999999
14 int main(){
15     //freopen("D://INPUT.txt","r",stdin);
16     int n,m;
17     while(cin>>n>>m&&n&&m){
18     int i=0,j;
19     for(i=1;i<=n;i++){
20         for(j=1;j<=n;j++){
21             map[i][j][0]=inf;
22             map[i][j][1]=inf;
23         }
24     }
25     i=0;
26     for(;i<m;i++){
27         int a,b;
28         cin>>a>>b;
29         cin>>map[b][a][0]>>map[b][a][1];
30         map[a][b][0]=map[b][a][0];
31         map[a][b][1]=map[b][a][1];
32     }
33     int s,e;
34     cin>>s>>e;
35     //cout<<s<<e<<endl; 
36     p[s].cost=0;
37     p[s].dis=0;
38     i=1;
39     for(;i<=n;i++){
40         if(i==s)
41         continue;
42         p[i].dis=map[s][i][0];
43         p[i].cost=map[s][i][1];
44     }
45     i=1;
46     for(;i<n;i++){
47         int j,min=inf,k;
48         for(j=1;j<=n;j++){
49             if(p[j].dis&&p[j].dis<min){
50                 min=p[j].dis;
51                 k=j;
52             }
53         }
54         if(k==e){    //找到结果就跳出
55             break;
56         }
57         for(j=1;j<=n;j++){
58             if(p[j].dis>p[k].dis+map[k][j][0]){
59                 p[j].dis=p[k].dis+map[k][j][0];
60                 p[j].cost=p[k].cost+map[k][j][1];
61             }
62             else{
63                 if(p[j].dis==p[k].dis+map[k][j][0]){   //距离相同时,寻找费用最小的路径
64                     p[j].cost=p[k].cost+map[k][j][1]>p[j].cost?p[j].cost:p[k].cost+map[k][j][1];
65                 }
66             }
67         }
68         p[k].dis=0;
69     }
70     cout<<p[e].dis<<' '<<p[e].cost<<endl;
71     }
72     return 0;
73 }

 

posted @ 2015-02-14 16:46  Deribs4  阅读(239)  评论(0)    收藏  举报