Dijkstra
引用自:点击打开链接
1 #include <algorithm> 2 #include <cstdio> 3 #include <cstring> 4 #include <functional> 5 #include <iostream> 6 #include <queue> 7 #include <vector> 8 using namespace std; 9 const int maxn = 100000 + 5; 10 typedef pair<int, int> pii; 11 struct Edge { 12 int to, weight; 13 Edge(int to, int weight) : to(to), weight(weight) {} 14 }; 15 vector<vector<Edge>> G(MAXN); //更快 16 struct Dijkstra { //打包在Dijkstra中 17 int n, m; 18 int dist[MAXN]; 19 int p[MAXN]; 20 Dijkstra(int n) : n(n) { 21 for (int i = 1; i <= n; i++) G[i].clear(); 22 } 23 void AddEdge(int from, int to, int weight) { 24 G[from].push_back(Edge(to, weight)); //保存from出发的边 25 } 26 void dijkstra(int s) { 27 priority_queue<pii, vector<pii>, greater<pii>> Q; 28 memset(dist, 0x7f, sizeof(dist)); //初始化为无穷大 29 30 dist[s] = 0; 31 Q.push(pii(0, s)); // pii (dist ,u) 32 while (!Q.empty()) { 33 pii P = Q.top(); 34 Q.pop(); 35 int u = P.second, d = P.first; 36 Q.pop(); 37 if (dist[u] < d) continue; 38 for (int i = 0; i < G[u].size(); i++) { 39 Edge& e = G[u][i]; 40 int v = e.to, w = e.weight; 41 if (dist[v] > dist[u] + w) { 42 dist[v] = dist[u] + w; 43 p[v] = u; //记录到各点的最短路径 44 Q.push(pii(dist[v], v)); 45 } 46 } 47 } 48 } 49 }; 50 int main() { 51 int n, m, u, v, w; 52 cin >> n >> m; // n 点 , m 边 53 Dijkstra d(n); 54 for (int i = 0; i < m; i++) { 55 scanf("%d%d%d", &u, &v, &w); 56 d.AddEdge(u, v, w); 57 d.AddEdge(v, u, w); 58 } 59 d.dijkstra(1); // 1点出发 60 cout << d.dist[n] << endl; //到n的最短路径 61 62 vector<int> ans; //到n点的最短路径 63 for (int i = n; i != 1; i = d.p[i]) ans.push_back(i); 64 ans.push_back(1); 65 for (int i = ans.size() - 1; i >= 0; i--) cout << ans[i] << ' '; 66 67 return 0; 68 }
SPFA,向前星储存
1 struct Edge{ 2 int from, to, w, next; 3 }e[1000001]; 4 int head[MAXN],vis[MAXN]; 5 int dist[MAXN]; 6 int n, m, tot; 7 8 void add_edge(int i, int j, int w) { 9 e[tot].from = i, e[tot].to = j, e[tot].w = w; 10 e[tot].next = head[i]; head[i] = tot++; 11 } 12 13 void SPFA(int s){ 14 queue <int> q; 15 for (int i = 1; i <= n; i++) 16 dist[i] = INF; 17 memset(vis, false, sizeof(vis)); 18 q.push(s); 19 dist[s] = 0; 20 while (!q.empty()){ 21 int u = q.front(); 22 q.pop(); 23 vis[u] = false; 24 for (int i = head[u]; i != -1; i = e[i].next){ 25 int v = e[i].to; 26 if (dist[v] > dist[u] + e[i].w){ 27 dist[v] = dist[u] + e[i].w; 28 if (!vis[v]){ 29 vis[v] = true; 30 q.push(v); 31 } 32 } 33 } 34 } 35 }