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 }

浙公网安备 33010602011771号