HDU 2544 最短路
题目见此:http://acm.hdu.edu.cn/showproblem.php?pid=2544
用来熟悉Dijkstra算法的好题
解题思路:
- Dijkstra+优先队列优化
- 如果把第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 }