最短路径问题

题目描述:
给你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


  1 #include <cstdlib>
  2 #include <cstdio>
  3 #include <cmath>
  4 #include <cstring>
  5 #include <cctype>
  6 
  7 #include <iostream>
  8 #include <string>
  9 #include <vector>
 10 #include <list>
 11 #include <deque>
 12 #include <set>
 13 #include <map>
 14 #include <stack>
 15 #include <queue>
 16 #include <algorithm>
 17 
 18 #define MAXN 100001
 19 #define MAXD 99999999
 20 using namespace std;
 21 
 22 
 23 struct Node{
 24     int d;
 25     int p;
 26 }g[1001][1001];
 27 
 28 int lowd[1001];
 29 int lowp[1001];
 30 
 31 int vis[1001];
 32 
 33 
 34 
 35 
 36 
 37 
 38 int main()
 39 {
 40     
 41 
 42     int n,m;
 43 
 44     while(scanf("%d%d",&n,&m)!=EOF)
 45     {
 46         if((n==0)&&(m==0))
 47             break;
 48 
 49 
 50         int i,j,k;
 51 
 52 
 53         for(i=1;i<=n;i++)
 54         {
 55             for(j=1;j<=n;j++)
 56             {
 57                 g[i][j].p=g[i][j].d=MAXD;
 58             }
 59 
 60 
 61         }
 62 
 63 
 64 
 65 
 66 
 67         for(i=0;i<m;i++)
 68         {
 69             int a,b,d,p;
 70 
 71             scanf("%d%d%d%d",&a,&b,&d,&p);
 72 
 73 
 74             if(g[a][b].d>d)
 75             {g[a][b].d=g[b][a].d=d;g[a][b].p=g[b][a].p=p;}
 76             else if(g[a][b].d==d)
 77             {
 78                 if(g[a][b].p>p)
 79                 g[a][b].p=g[b][b].p=p;
 80             }
 81 
 82 
 83         }
 84 
 85 
 86         
 87         int s,t;
 88 
 89         scanf("%d%d",&s,&t);
 90 
 91 
 92         for(i=1;i<=n;i++)
 93         {
 94             lowd[i]=g[s][i].d;
 95             lowp[i]=g[s][i].p;
 96             vis[i]=0;
 97         }
 98 
 99 
100         vis[s]=1;
101 
102 
103         for(i=1;i<n;i++)
104         {
105             int temp=MAXD;
106             int k=-1;
107 
108 
109             for(j=1;j<=n;j++)
110             {
111                 if(vis[j]==0)
112                 {
113                     if(temp>lowd[j])
114                     {k=j;temp=lowd[j];}
115                 }
116             }
117 
118             if(k==-1)
119                 break;
120 
121             vis[k]=1;
122 
123             if(k==t)
124                 break;
125 
126             for(j=1;j<=n;j++)
127             {
128                 if(vis[j]==0)
129                 {
130                     if(lowd[j]>lowd[k]+g[k][j].d)
131                     {lowd[j]=lowd[k]+g[k][j].d;lowp[j]=lowp[k]+g[k][j].p;}
132                     else if(lowd[j]==lowd[k]+g[k][j].d)
133                     {
134                         if(lowp[j]>lowp[k]+g[k][j].p)
135                         {lowp[j]=lowp[k]+g[k][j].p;}
136                     }
137                 }
138             }
139         }
140 
141 
142         printf("%d %d\n",lowd[t],lowp[t]);
143     }
144                 
145    
146   
147     return 0;
148 }

 

posted @ 2012-05-31 09:49  cseriscser  阅读(149)  评论(0编辑  收藏  举报