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 }