Dijkstra板子

 1 #include <iostream>
 2 #include <string.h>
 3 using namespace std;
 4 const int N = 509;
 5 int g[N][N],dist[N],st[N];
 6 int n,m;
 7 
 8 int dijkstra()
 9 {
10     for(int i = 1;i <= n;++i)
11     {
12         int t = -1;
13         for(int j = 1;j <= n;++j)
14             if(!st[j] && (t == -1 || dist[t] > dist[j]))
15                 t = j;
16         st[t] = 1;
17         for(int j = 1;j <= n;++j)
18             dist[j] = min(dist[j],dist[t] + g[t][j]);
19     }
20     if(dist[n] == 0x3f3f3f3f)
21         return -1;
22     else
23         return dist[n];
24 }
25 
26 int main()
27 {
28     cin >> n >> m;
29     memset(g,0x3f3f3f3f,sizeof g);
30     for(int i = 1;i <= m;++i)
31     {
32         int a,b,c;
33         cin >> a >> b >> c;
34         g[a][b] = min(g[a][b],c);
35     }
36     memset(dist,0x3f3f3f3f,sizeof dist);
37     dist[1] = 0;
38     cout << dijkstra() << endl;
39     return 0;
40 }

 堆优化:

主要利用小根堆优化取距离最小点过程中的速度,从O(n)优化至O(1),相应地,时间复杂度总体从O(n2)优化至O(mlogn)。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <queue>
 4 #include <string.h>
 5 using namespace std;
 6 const int N = 1e6,INF = 0x3f3f3f3f;
 7 int h[N],e[N],ne[2*N],v[N],dist[N],st[N],idx;
 8 priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> heap;
 9 
10 void add(int a,int b,int value)
11 {
12     e[idx] = b;
13     v[idx] = value;
14     ne[idx] = h[a];
15     h[a] = idx++;
16 }
17 
18 void dijkstra()
19 {
20     while(heap.size())
21     {
22         auto u = heap.top();
23         heap.pop();
24         int ver = u.second,dis = u.first;
25         if(st[ver])
26             continue;
27         st[ver] = 1;
28         for(int i = h[ver];i != -1;i = ne[i])
29         {
30             int j = e[i];
31             if(dist[j] > dis + v[i])
32             {
33                 dist[j] = dis + v[i];
34                 heap.push({dist[j],j});
35             }
36         }
37     }
38 }
39 
40 int main()
41 {
42     memset(h,-1,sizeof h);
43     int n,m;
44     cin >> n >> m;
45     while(m--)
46     {
47         int a,b,c;
48         cin >> a >> b >> c;
49         add(a,b,c);
50     }
51     memset(dist,INF,sizeof dist);
52     dist[1] = 0;
53     heap.push({0,1});
54     dijkstra();
55     if(dist[n] == 0x3f3f3f3f)
56         cout << -1 << endl;
57     else
58         cout << dist[n] << endl;
59     return 0;
60 }

 

posted @ 2021-10-20 23:23  Modest-Hamilton  阅读(69)  评论(0)    收藏  举报