zoukankan      html  css  js  c++  java
  • HDU2544 最短路dij

    纯最短路。

      1 ///HDU 2544堆优化的最短路
      2 #include <cstdio>
      3 #include <iostream>
      4 #include <sstream>
      5 #include <cmath>
      6 #include <cstring>
      7 #include <cstdlib>
      8 #include <string>
      9 #include <vector>
     10 #include <map>
     11 #include <set>
     12 #include <queue>
     13 #include <stack>
     14 #include <algorithm>
     15 using namespace std;
     16 #define ll long long
     17 #define _cle(m, a) memset(m, a, sizeof(m))
     18 #define repu(i, a, b) for(int i = a; i < b; i++)
     19 #define repd(i, a, b) for(int i = b; i >= a; i--)
     20 #define sfi(n) scanf("%d", &n)
     21 #define pfi(n) printf("%d
    ", n)
     22 const int MAXN = 2200;
     23 const int MAXM = 20200;
     24 const int INF=0x3f3f3f3f;
     25 struct Node
     26 {
     27     int to,next,w;
     28 } edge[MAXM];
     29 struct HeapNode
     30 {
     31     int d, u;
     32     bool operator < (const HeapNode& rhs) const
     33     {
     34         return d > rhs.d;
     35     }
     36 };
     37 struct Dijkstra
     38 {
     39     int head[MAXN],d[MAXN];
     40     bool done[MAXN];
     41     int cnt;
     42     void init()
     43     {
     44         memset(head,-1,sizeof(head));
     45         cnt = 0;
     46     }
     47     void AddEdge(int u, int v, int w)
     48     {
     49         edge[cnt].to=v,edge[cnt].next=head[u];
     50         edge[cnt].w=w,head[u]=cnt++;
     51         edge[cnt].to=u,edge[cnt].next=head[v];
     52         edge[cnt].w=w,head[v]=cnt++;
     53     }
     54     void dijkstra(int s,int n)
     55     {
     56         priority_queue<HeapNode> Q;
     57         for(int i = s; i <= n; i++)
     58             d[i] = INF;
     59         d[s] = 0;
     60         memset(done, 0, sizeof(done));
     61         Q.push((HeapNode)
     62         {
     63             0, s
     64         });
     65         while(!Q.empty())
     66         {
     67             HeapNode x = Q.top();
     68             Q.pop();
     69             int u = x.u;
     70             if(done[u]) continue;
     71             done[u] = true;
     72             for(int i=head[u]; i!=-1; i=edge[i].next)
     73             {
     74                 int v=edge[i].to;
     75                 if(d[v] > d[u] + edge[i].w)
     76                 {
     77                     d[v] = d[u] + edge[i].w;
     78                     Q.push((HeapNode)
     79                     {
     80                         d[v], v
     81                     });
     82                 }
     83             }
     84         }
     85     }
     86 } dij;
     87 int main()
     88 {
     89     int n,m,a,b,c;
     90     while(scanf("%d%d",&n,&m),n+m)
     91     {
     92         dij.init();
     93         repu(i,0,m)
     94         {
     95             scanf("%d%d%d",&a,&b,&c);
     96             dij.AddEdge(a,b,c);
     97             dij.AddEdge(b,a,c);
     98         }
     99         dij.dijkstra(1,n);
    100         printf("%d
    ",dij.d[n]);
    101     }
    102     return 0;
    103 }
    堆优化的Dij
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <algorithm>
     5 #include <cstring>
     6 #include <cmath>
     7 #include <vector>
     8 #include <queue>
     9 #include <stack>
    10 #include <set>
    11 #include <map>
    12 using namespace std;
    13 const int maxn=2200;
    14 const int INF=0x3f3f3f3f;
    15 struct Edge
    16 {
    17     int u, v, d;
    18     Edge(int u, int v, int d):u(u), v(v), d(d) {}
    19 };
    20 struct qnode
    21 {
    22     int u,d;
    23     qnode(int u, int d):u(u), d(d) {}
    24     bool operator < (const qnode a)const
    25     {
    26         return d>a.d;
    27     }
    28 };
    29 struct Dijkstra
    30 {
    31     int n;
    32     vector<int> G[maxn];
    33     vector<Edge> edge;
    34     int d[maxn];
    35     bool vis[maxn];
    36     void init(int n)
    37     {
    38         this->n = n;
    39         for(int i=0; i<=n; i++)
    40         {
    41             G[i].clear();
    42             vis[i]=0;
    43             d[i]=INF;
    44         }
    45         edge.clear();
    46     }
    47     void AddEdge(int u, int v, int d)
    48     {
    49         G[u].push_back(edge.size());
    50         edge.push_back(Edge(u, v, d));
    51     }
    52     void dijkstra(int s)
    53     {
    54         priority_queue<qnode> q;
    55         d[s]=0;
    56         q.push(qnode(s, 0));
    57         while(!q.empty())
    58         {
    59             qnode x=q.top();
    60             q.pop();
    61             if(vis[x.u])
    62                 continue ;
    63             vis[x.u]=true;
    64             for(int i=0; i<G[x.u].size(); i++)
    65             {
    66                 Edge& e=edge[G[x.u][i]];
    67                 if(d[e.v]>d[x.u]+e.d)
    68                 {
    69                     d[e.v]=d[x.u]+e.d;
    70                     q.push(qnode(e.v, d[e.v]));
    71                 }
    72             }
    73         }
    74     }
    75 } dij;
    76 
    77 int main()
    78 {
    79     int n, m;
    80     while(scanf("%d%d", &n, &m),n+m)
    81     {
    82         dij.init(n);
    83         while(m--)
    84         {
    85             int u, v, w;
    86             scanf("%d%d%d", &u, &v, &w);
    87             dij.AddEdge(u, v, w);
    88             dij.AddEdge(v, u, w);
    89         }
    90         dij.dijkstra(1);
    91         printf("%d
    ",dij.d[n]);
    92     }
    93     return 0;
    94 }
    邻接矩阵Dij

    本来以为这两个时间效率相差会很大,看来只在稠密图中奏效。

    当图稠密起来后一般需要用堆优化的dijkstra。。。

  • 相关阅读:
    软件测试理论提炼
    测试左移与右移
    RFS工具基础学习
    机遇——沃特&#183;马龙
    SVN (Subversion+tortoiseSVN)使用手册
    MongoDB基本使用
    win7系统快捷键操作大全
    SQL Server Profiler使用方法
    转载《soapUI 学习日志》
    HTMLTestRunner中文测试报告
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4765644.html
Copyright © 2011-2022 走看看