1. 程式人生 > >HDU - 3790 最短路徑問題(Dijkstra+優先隊列優化)

HDU - 3790 最短路徑問題(Dijkstra+優先隊列優化)

pop == pair class code empty make cst blog

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3790

題意:中文題(邊被賦予兩種屬性,一種是路徑,一種是花費),然後略。(逃......

今天看了卿學姐的視頻,初嘗SPFA和Dijkstra。

一個是用隊列優化,一個是用優先隊列優化。這道題目用這兩種方法都可以。

dijkstra算法思想(貪心):從距離起點最近的點開始,從這個點遍歷一遍它周圍的點,進行松弛操作,直到最終點。

整個的算法思想就是貪心,每次都給它形成最短路。

這道題目值得註意的是預處理階段,因為可能有重邊的情況,要特別考慮一下。

 1 #include <cstdio>
 2
#include <queue> 3 using namespace std; 4 5 //鄰接矩陣存圖 6 const int INF=0x3f3f3f3f; 7 const int maxn=1111; 8 int E[maxn][maxn],cost[maxn][maxn]; 9 int n,m; 10 int d[maxn],c[maxn]; 11 12 void init() 13 { 14 for(int i=0;i<maxn;i++) c[i]=d[i]=INF; 15 for(int i=0;i<maxn;i++)
16 for(int j=0;j<maxn;j++) 17 cost[i][j]=E[i][j]=INF; 18 } 19 20 int main(){ 21 while(scanf("%d %d",&n,&m)!=EOF) 22 { 23 if(n==0&&m==0) break; 24 init(); 25 for(int i=0;i<m;i++) 26 { 27 int x,y,z,value; 28 scanf("
%d %d %d %d",&x,&y,&z,&value); 29 if(E[x][y]>z) 30 { 31 E[x][y]=E[y][x]=z; 32 cost[x][y]=cost[y][x]=value; 33 } 34 else if(E[x][y]==z){ 35 if(cost[x][y]>value) cost[x][y]=cost[y][x]=value; 36 } 37 } 38 int s,t; 39 scanf("%d %d",&s,&t); 40 priority_queue< pair<int,int> > Q; 41 d[s]=0;c[s]=0; 42 Q.push(make_pair(-d[s],s)); 43 44 while(!Q.empty()) 45 { 46 int now=Q.top().second; 47 Q.pop(); 48 for(int i=1;i<=n;i++) 49 { 50 if(d[i]>d[now]+E[now][i]) 51 { 52 c[i]=c[now]+cost[now][i]; 53 d[i]=d[now]+E[now][i]; 54 Q.push(make_pair(-d[i],i)); 55 } 56 else if(d[i]==d[now]+E[now][i]){ 57 if(c[i]>c[now]+cost[now][i]) 58 c[i]=c[now]+cost[now][i]; 59 } 60 } 61 } 62 printf("%d %d\n",d[t],c[t]); 63 } 64 return 0; 65 }

HDU - 3790 最短路徑問題(Dijkstra+優先隊列優化)