Dijkstra+SPFA 模板
Dijkstra
引用自:点击打开链接
- #include <algorithm>
- #include <cstdio>
- #include <cstring>
- #include <functional>
- #include <iostream>
- #include <queue>
- #include <vector>
- using namespace std;
- const int maxn = + ;
- typedef pair<int, int> pii;
- struct Edge {
- int to, weight;
- Edge(int to, int weight) : to(to), weight(weight) {}
- };
- vector<vector<Edge>> G(MAXN); //更快
- struct Dijkstra { //打包在Dijkstra中
- int n, m;
- int dist[MAXN];
- int p[MAXN];
- Dijkstra(int n) : n(n) {
- for (int i = ; i <= n; i++) G[i].clear();
- }
- void AddEdge(int from, int to, int weight) {
- G[from].push_back(Edge(to, weight)); //保存from出发的边
- }
- void dijkstra(int s) {
- priority_queue<pii, vector<pii>, greater<pii>> Q;
- memset(dist, 0x7f, sizeof(dist)); //初始化为无穷大
- dist[s] = ;
- Q.push(pii(, s)); // pii (dist ,u)
- while (!Q.empty()) {
- pii P = Q.top();
- Q.pop();
- int u = P.second, d = P.first;
- Q.pop();
- if (dist[u] < d) continue;
- for (int i = ; i < G[u].size(); i++) {
- Edge& e = G[u][i];
- int v = e.to, w = e.weight;
- if (dist[v] > dist[u] + w) {
- dist[v] = dist[u] + w;
- p[v] = u; //记录到各点的最短路径
- Q.push(pii(dist[v], v));
- }
- }
- }
- }
- };
- int main() {
- int n, m, u, v, w;
- cin >> n >> m; // n 点 , m 边
- Dijkstra d(n);
- for (int i = ; i < m; i++) {
- scanf("%d%d%d", &u, &v, &w);
- d.AddEdge(u, v, w);
- d.AddEdge(v, u, w);
- }
- d.dijkstra(); // 1点出发
- cout << d.dist[n] << endl; //到n的最短路径
- vector<int> ans; //到n点的最短路径
- for (int i = n; i != ; i = d.p[i]) ans.push_back(i);
- ans.push_back();
- for (int i = ans.size() - ; i >= ; i--) cout << ans[i] << ' ';
- return ;
- }
SPFA,向前星储存
- struct Edge{
- int from, to, w, next;
- }e[];
- int head[MAXN],vis[MAXN];
- int dist[MAXN];
- int n, m, tot;
- void add_edge(int i, int j, int w) {
- e[tot].from = i, e[tot].to = j, e[tot].w = w;
- e[tot].next = head[i]; head[i] = tot++;
- }
- void SPFA(int s){
- queue <int> q;
- for (int i = ; i <= n; i++)
- dist[i] = INF;
- memset(vis, false, sizeof(vis));
- q.push(s);
- dist[s] = ;
- while (!q.empty()){
- int u = q.front();
- q.pop();
- vis[u] = false;
- for (int i = head[u]; i != -; i = e[i].next){
- int v = e[i].to;
- if (dist[v] > dist[u] + e[i].w){
- dist[v] = dist[u] + e[i].w;
- if (!vis[v]){
- vis[v] = true;
- q.push(v);
- }
- }
- }
- }
- }
Dijkstra+SPFA 模板的更多相关文章
- 最短路径---dijkstra算法模板
dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 #include<stdio.h> #include<stri ...
- SPFA模板 Bellmanford优化版
SPFA模板: queue<int>Q; ]; ],sumv[]; *],__next[*],e,w[*],first[],cnts[]; void AddEdge(int U,int V ...
- floyed dij spfa 模板
/* SPFA模板 */ const int inf=0x3f3f3f3f; inline int SPFA(int s){ memset(dis,inf,sizeof(dis)); queue< ...
- 图的最短路径算法Dijkstra算法模板
Dijkstra算法:伪代码 //G为图,一般设为全局变量,数组d[u]为原点到达个点的额最短路径, s为起点 Dijkstra(G, d[u], s){ 初始化: for (循环n次){ u = 是 ...
- POJ2387 Til the Cows Come Home(SPFA + dijkstra + BallemFord 模板)
Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37662 Accepted ...
- Dijkstra堆优化与SPFA模板
Dijkstra+优先队列 #include<cstdio> #include<cctype> #include<queue> #include<cstrin ...
- 几个小模板:topology, dijkstra, spfa, floyd, kruskal, prim
1.topology: #include <fstream> #include <iostream> #include <algorithm> #include & ...
- dijkstra spfa prim kruskal 总结
最短路和最小生成树应该是很早学的,大家一般都打得烂熟,总结一下几个问题 一 dijkstra O((V+E)lgV) //V节点数 E边数 dijkstra不能用来求最长路,因为此时局部最优解已经 ...
- hdu-2544-最短路(SPFA模板)
题目链接 题意很清晰,入门级题目,适合各种模板,可用dijkstra, floyd, Bellman-ford, spfa Dijkstra链接 Floyd链接 Bellman-Ford链接 SPFA ...
随机推荐
- qt连接mysql数据库实例
qt5.2版本已经封装进去了mysql驱动,所以省去了我们现编译的麻烦!!! #include <QCoreApplication> #include <QDebug> #in ...
- gentoo在KVM+QEMU中安装笔记
gentoo是比较难安装的,本笔记主要是记录本次安装过程,以备参考. 1.首先,下载镜像,可以去国内各大镜像网站下载,我选择的是清华的镜像源:https://mirrors.tuna.tsinghua ...
- tomcat-windows10环境搭建
1.进入Tomcat官网Apache Tomcat® - Welcome! 2.根据操作系统选择合适的版本下载 zip用于windows操作系统, tar.gz用于unix和linux操作系统 Bin ...
- 在 Vs2013中查看类的内部布局
第一步:在Visual Studio中配置命令行环境(Command Prompt) 来自:https://blog.csdn.net/u013553529/article/details/77417 ...
- Leetcode面试题17.20_连续中值
题目地址 实现一个数列的动态添加和查询中位数. 复杂点的话应该可以写个平衡树什么的,然后查询第k大,还可以删除数字. 简单点的话显然可以维护两个堆,一个大顶堆一个小顶堆,而且大顶堆最多比小顶堆多一个, ...
- 一文彻底搞懂 TCP三次握手、四次挥手过程及原理
原创文章出自公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论哪 ...
- junit测试的介绍和应用
目录 1.junit测试简介 2.运行环境 3.测试过程 1.junit测试简介 JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent ...
- NCE L3
单词 课文
- js—求数组中的最大最小值
参考链接:https://www.w3cplus.com/javascript/calculate-the-max-min-value-from-an-array.html Math.min.appl ...
- 手把手教你使用数据可视化BI软件创建仓库可视化管理大屏
灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件. 本文以仓库可视化管理大屏为例为 ...