标签:处理 ret cond log 中文 起点 hdu target 预处理
题目链接: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+优先队列优化)
标签:处理 ret cond log 中文 起点 hdu target 预处理
原文地址:http://www.cnblogs.com/Leonard-/p/7107394.html