九度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 }