Dijkstra+SPFA 模板

博客提及Dijkstra和SPFA,SPFA采用向前星储存,同时给出了Dijkstra的引用链接以及SPFA的转载链接。

Dijkstra

引用自:点击打开链接

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<vector>
 5 #include<cstring>
 6 #include<functional>
 7 #include<algorithm>
 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     bool done[maxn];
19     int dist[maxn];
20     int p[maxn];
21     Dijkstra(int n) :n(n) {
22         for (int i = 0; i < n; i++) G[i].clear();
23     }
24     void AddEdge(int from, int to, int weight) {
25         G[from].push_back(Edge(to, weight));  //保存from出发的边 
26     }
27     void dijkstra(int s)
28     {
29         priority_queue<pii, vector<pii>, greater<pii> > Q;
30         memset(dist, 0x7f, sizeof(dist));                  //初始化为无穷大 
31         memset(done, false, sizeof(done));
32 
33         dist[s] = 0;
34         Q.push(pii(0, s));      //pii (dist ,u)
35         while (!Q.empty())
36         {
37             int u = Q.top().second; Q.pop();
38             if (done[u]) continue;
39             done[u] = true;
40             for (int i = 0; i < G[u].size(); i++)
41             {
42                 Edge& e = G[u][i];
43                 int v = e.to, w = e.weight;
44                 if (dist[v] > dist[u] + w)
45                 {
46                     dist[v] = dist[u] + w;
47                     p[v] = u;            //记录到各点的最短路径 
48                     Q.push(pii(dist[v], v));
49                 }
50             }
51         }
52     }
53 };
54 int main()
55 {
56     int n, m, u, v, w;
57     cin >> n >> m;       //n 点 , m 边 
58     Dijkstra d(n);
59     for (int i = 0; i < m; i++)
60     {
61         scanf("%d%d%d", &u, &v, &w);
62         d.AddEdge(u, v, w);
63         d.AddEdge(v, u, w);
64     }
65     d.dijkstra(1);          //1点出发 
66     cout << d.dist[n] << endl;  //到n的最短路径 
67 
68     vector<int> ans;     //到n点的最短路径
69     for (int i = n; i != 1; i = d.p[i]) ans.push_back(i);
70     ans.push_back(1);
71     for (int i = ans.size() - 1; i >= 0; i--) cout << ans[i] << ' ';
72 
73     return 0;
74 }

 


 

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 }

 

转载于:https://www.cnblogs.com/romaLzhih/p/9565832.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值