HDU 2544 最短路

题目见此:http://acm.hdu.edu.cn/showproblem.php?pid=2544

用来熟悉Dijkstra算法的好题

解题思路:

  1. Dijkstra+优先队列优化
  2. 如果把第14行去掉时间用时会多15ms

贴代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 using namespace std;
 5 
 6 const int MAXN = 101;
 7 const int INF = 0xfffffff;
 8 struct Node
 9 {
10     int to, val;
11     Node(int _p, int _v) : to(_p), val(_v) {}
12     bool operator < (const Node& a) const
13     {
14         if(val == a.val)    return to < a.to;
15         return val > a.val;    
16     }
17 };
18 vector<Node> eg[MAXN];
19 int dis[MAXN], pre[MAXN], N, line;
20 bool S[MAXN];
21 
22 void Dijkstra(int start)
23 {
24     memset(S, 0, sizeof(S));
25     for(int i=0 ; i<=N ; i++)
26         dis[i] = INF;
27     dis[start] = 0;
28     priority_queue<Node> q;
29     q.push(Node(start, dis[start]));
30     while(!q.empty())
31     {
32         Node t = q.top();    q.pop();
33         if(S[t.to])    continue;
34         S[t.to] = 1;
35         for(int i=0 ; i<eg[t.to].size() ; i++)  //这里从0开始
36         {
37             Node nei = eg[t.to][i];
38             if(S[nei.to] == 0 && t.val + nei.val < dis[nei.to]) //新路径小于旧路径
39             {
40                 dis[nei.to] = t.val + nei.val;
41                 q.push(Node(nei.to, dis[nei.to]));
42             }
43         }
44     }
45 }
46 
47 int main()
48 {
49     while(scanf("%d %d", &N, &line), N+line)
50     {
51         for(int i=0 ; i<=N ; i++)  //用0-N可以同时处理 1至N 或 0至N-1 的情况
52             eg[i].clear();
53         while(line--)
54         {
55             int p, q, d;
56             scanf("%d %d %d", &p, &q, &d);
57             eg[p].push_back(Node(q, d));
58             eg[q].push_back(Node(p, d));
59         }
60         Dijkstra(1);
61         printf("%d\n", dis[N]);
62     }
63 }
View Code

 

posted on 2013-06-16 14:51  白~  阅读(115)  评论(0编辑  收藏  举报

导航