HDU 3790 最短路径问题 Dijkstra
http://acm.hdu.edu.cn/showproblem.php?pid=3790
题意:
普通的最短路问题,只不过加了个费用,在有多条最短路的情况下输出花费最少的那组答案.(双重权值)
坑爹:
有重边的情况,开始做的时候当判断重边比原来小的时候,还去判断费用是不是比原来小..这样就会出错..是在找最短路径的前提下找到最小的花费.
disprice数组和dis数组同步操作,但对dis进行松弛的时候,如果经过另一条路径在到目的地就要比较这两条路哪变的费用少.
解法:
用个Dijkstra算法将dis和disprice进行松弛解出答案.
View Code
1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 10000 + 10; 5 const int INF = 0x3fffffff; 6 int map[maxn][maxn]; 7 int price[maxn][maxn]; 8 int dis[maxn]; 9 int disprice[maxn]; 10 int used[maxn]; 11 int N; 12 int M; 13 int start; 14 int over; 15 16 void init() 17 { 18 int i; 19 int j; 20 for(i=0; i<=N; i++) 21 { 22 for(j=0; j<=N; j++) 23 { 24 map[i][j]=INF; 25 price[i][j]=INF; 26 } 27 } 28 } 29 30 void Dijkstra() 31 { 32 int i; 33 for(i=0; i<=N; i++) 34 { 35 dis[i]=INF; 36 disprice[i]=INF; 37 } 38 dis[start]=0; 39 disprice[start]=0; 40 int j; 41 for(j=0; j<N; j++) 42 { 43 int min=INF; 44 int minnode; 45 for(i=1; i<=N; i++) 46 { 47 if(dis[i]<min && !used[i]) 48 { 49 min=dis[i]; 50 minnode=i; 51 } 52 } 53 used[minnode]=1; 54 for(i=1; i<=N; i++) 55 { 56 if(dis[i]>dis[minnode]+map[minnode][i] && !used[i]) 57 { 58 dis[i]=dis[minnode]+map[minnode][i]; 59 disprice[i]=disprice[minnode]+price[minnode][i]; 60 } 61 if(dis[i]==dis[minnode]+map[minnode][i] && !used[i]) 62 { 63 if(disprice[i]>disprice[minnode]+price[minnode][i]) 64 { 65 disprice[i]=disprice[minnode]+price[minnode][i]; 66 } 67 } 68 } 69 } 70 } 71 72 int main() 73 { 74 while(cin>>N>>M,N+M) 75 { 76 init(); 77 memset(used,0,sizeof(used)); 78 while(M--) 79 { 80 int a; 81 int b; 82 int d; 83 int p; 84 cin>>a>>b>>d>>p; 85 if(d<map[a][b]) 86 { 87 map[a][b]=d; 88 map[b][a]=d; 89 price[a][b]=p; 90 price[b][a]=p; 91 } 92 } 93 cin>>start>>over; 94 Dijkstra(); 95 cout<<dis[over]<<" "<<disprice[over]<<endl; 96 } 97 return 0; 98 }

浙公网安备 33010602011771号