码迷,mamicode.com
首页 > 其他好文 > 详细

HDU - 3790 最短路径问题(Dijkstra+优先队列优化)

时间:2017-07-02 23:21:55      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:处理   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!