Dijkstra+SPFA 模板

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 }

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值