hdu 3790 最短路径问题

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=3790

用Dijstra,考虑重边的情况。

源代码:

 1 #include <iostream>
 2 #include<queue>
 3 #include<stdio.h>
 4 #include<cstring>
 5 using namespace std;
 6 typedef struct{
 7 int di,p;}road;
 8 road w[1005][1005],d[1005];
 9 int visit[1005];
10 const int INF=100000000;
11 int main()
12 {
13     int n,m,i,j,s,e,ok,temp_1,temp_2,dis,pa,re;
14     while(scanf("%d %d",&n,&m)){
15       if(n+m==0) break;
16       memset(visit,0,sizeof(visit));
17       for(i=1;i<=n;i++)
18         for(j=1;j<=n;j++){
19           w[i][j].di=INF;
20           w[i][j].p=INF;
21         }
22       for(i=1;i<=m;i++){
23         scanf("%d %d %d %d",&temp_1,&temp_2,&dis,&pa);
24         if(w[temp_1][temp_2].di>dis) {                
25           w[temp_1][temp_2].di=w[temp_2][temp_1].di=dis;
26           w[temp_1][temp_2].p=w[temp_2][temp_1].p=pa;  
27         }
28          else if(w[temp_1][temp_2].di==dis)
29           if(w[temp_1][temp_2].p>pa)
30              w[temp_1][temp_2].p=w[temp_2][temp_1].p=pa;
31         }
/*注意这里不能合并写成if{(距离>=输入值)if(花费>输入值)更改花费}
eg:原来路径 时间值为3 2,若读入一组2 4,那么就会更新为2 2,但正确的应该是更新为2 4*/
32 33 scanf("%d %d",&s,&e); 34 for(i=1;i<=n;i++){ 35 d[i].di=(i==s?0:INF); 36 d[i].p=(i==s?0:INF); 37 } 38 queue<int>q; 39 q.push(s); 40 visit[s]=1; 41 while(!q.empty()){ 42 int temp=q.front(); 43 q.pop(); 44 int min=INF; 45 ok=0; 46 for(i=1;i<=n;i++){ 47 if(visit[i]==0&&i!=temp){ 48 if(d[i].di>d[temp].di+w[temp][i].di){ 49 d[i].di=d[temp].di+w[temp][i].di; 50 d[i].p=d[temp].p+w[temp][i].p; 51 } 52 else if(d[i].di==d[temp].di+w[temp][i].di) 53 if(d[i].p>d[temp].p+w[i][temp].p) 54 d[i].p=d[temp].p+w[temp][i].p; 55 56 if(d[i].di<min){ 57 re=i; 58 min=d[i].di; 59 ok=1; 60 } 61 } 62 } 63 if(ok==1){ 64 q.push(re); 65 visit[re]=1; 66 } 67 } 68 printf("%d %d\n",d[e].di,d[e].p); 69 } 70 return 0; 71 }

 

posted @ 2013-08-07 18:39  小の泽  阅读(150)  评论(0编辑  收藏  举报