最短路算法(Dijsktra + 优先队列)

来源:互联网 发布:孟非睡女嘉宾 知乎 编辑:程序博客网 时间:2024/06/06 21:01

模板,对应测试题HDU 2544

  1. #include <queue>  
  2. #include <vector>  
  3. #include <cstdio>  
  4. #include <cstring>  
  5. #include <iostream>  
  6. #include <algorithm>  
  7. #define  pb push_back  
  8. #define  mp make_pair  
  9. #define  sz(x) ((int)(x).size())  
  10. using namespace std;  
  11.   
  12. const int N = 1010;  
  13. const int INF = 12345678;  
  14. int n, m, dis[N];  
  15. bool vis[N];  
  16. struct Node {  
  17.     int d, e;  
  18.     bool operator < (const Node x) const {  
  19.         return x.d < d;  
  20.     }  
  21.     Node(int d, int e):d(d), e(e){}  
  22. };  
  23. vector<pair<intint> > V[N];  
  24.   
  25. void dijkstra(int s) {  
  26.     priority_queue<Node> q;  
  27.     fill(dis + 1, dis + n + 1, INF);  
  28.     fill(vis + 1, vis + n + 1, false);  
  29.     q.push(Node(0, s));  
  30.     dis[s] = 0;  
  31.     while(!q.empty()) {  
  32.         Node deq = q.top(); q.pop();  
  33.         if(vis[deq.e])    
  34.             continue;  
  35.         vis[deq.e] = true;  
  36.         for(int i = 0;i < sz(V[deq.e]);i++) {  
  37.             int e = V[deq.e][i].first;  
  38.             int w = V[deq.e][i].second;  
  39.             if(dis[deq.e] < dis[e] - w) {  
  40.                 dis[e] = dis[deq.e] + w;  
  41.                 q.push(Node(dis[e], e));      
  42.             }  
  43.         }  
  44.     }     
  45. }  
  46.   
  47. int main(){  
  48.     while(cin >> n >> m, n || m) {  
  49.         for(int i = 1;i <= n;i++)  
  50.             V[i].clear();  
  51.         for(int i = 0;i < m;i++) {  
  52.             int a, b, w;  
  53.             scanf("%d%d%d", &a, &b, &w);  
  54.             V[a].pb(mp(b, w));  
  55.             V[b].pb(mp(a, w));    
  56.         }  
  57.         dijkstra(1);  
  58.         printf("%d\n", dis[n]);  
  59.     }  
  60.     return 0;  

0 0
原创粉丝点击