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 模板的更多相关文章

  1. 最短路径---dijkstra算法模板

    dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 #include<stdio.h> #include<stri ...

  2. SPFA模板 Bellmanford优化版

    SPFA模板: queue<int>Q; ]; ],sumv[]; *],__next[*],e,w[*],first[],cnts[]; void AddEdge(int U,int V ...

  3. floyed dij spfa 模板

    /* SPFA模板 */ const int inf=0x3f3f3f3f; inline int SPFA(int s){ memset(dis,inf,sizeof(dis)); queue< ...

  4. 图的最短路径算法Dijkstra算法模板

    Dijkstra算法:伪代码 //G为图,一般设为全局变量,数组d[u]为原点到达个点的额最短路径, s为起点 Dijkstra(G, d[u], s){ 初始化: for (循环n次){ u = 是 ...

  5. POJ2387 Til the Cows Come Home(SPFA + dijkstra + BallemFord 模板)

    Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37662   Accepted ...

  6. Dijkstra堆优化与SPFA模板

    Dijkstra+优先队列 #include<cstdio> #include<cctype> #include<queue> #include<cstrin ...

  7. 几个小模板:topology, dijkstra, spfa, floyd, kruskal, prim

    1.topology: #include <fstream> #include <iostream> #include <algorithm> #include & ...

  8. dijkstra spfa prim kruskal 总结

    最短路和最小生成树应该是很早学的,大家一般都打得烂熟,总结一下几个问题 一  dijkstra  O((V+E)lgV) //V节点数 E边数 dijkstra不能用来求最长路,因为此时局部最优解已经 ...

  9. hdu-2544-最短路(SPFA模板)

    题目链接 题意很清晰,入门级题目,适合各种模板,可用dijkstra, floyd, Bellman-ford, spfa Dijkstra链接 Floyd链接 Bellman-Ford链接 SPFA ...

随机推荐

  1. ARTS Week 13

    Jan 20, 2020 ~ Jan 26, 2020 Algorithm Problem 141 Linked List Cycle (环形链表) 题目链接 题目描述:给定一个链表,判断链表中是否存 ...

  2. Grafana & Graphite & Collectd:监控系统

    简介 监控是运维工作中的一个重要组成部分,今天介绍一套新的监控工具,方便好用,扩展性强,这套工具有三个组件,Grafana & Graphite & Collectd: Grafana ...

  3. 命令拼接符 || && 区别

    &&   前面的命令执行成功,执行拼接符后面的命令. ||      前面的命令执行失败,执行拼接符后面的命令. 举例: (1)whoami && net user 真 ...

  4. Tomcat 配置2 tomcat-users.xml

    Tomcat的配置 Tomcat的主要配置文件有3个,分别是:    Tomcat-users.xml.    web.xml    server.xml. 配置Tomcat-users.xml 该文 ...

  5. Linux 下用 superpi 测试 CPU 性能

  6. monkey命令行测试

    一. 什么是Monkey monkey是google提供的一个用于稳定性与压力测试的命令行工具.monkey程序由android系统自带,位于/sdcard/system/framework/monk ...

  7. package.json(node)中,多个命令行合并一条

    1. ‘&’ 并行执行顺序,同时执行 "dev":"node test.js & webpack" 2.'&&'继发顺序,执行前 ...

  8. C#基础知识学习(2)string类中的方法

    1.Compare 比较字符串 用来比较2个字符串的长度大小和值是否相同,相同则返回0,当x比y小返回-1,否则返回1,如果长度相同,且值不同,则返回1,代码如下 public static void ...

  9. java 企业站源码 兼容手机平板PC 自适应响应式 SSM主流框架 freemaker 静态引擎

    前台: 支持四套模版, 可以在后台切换   系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以 ...

  10. JS数据类型和堆栈+变量比较和值的复制+参数传递和类型检测

    变量命名 变量名:字母 数字 下划线 美元符$ jquery:  $     $.each()   $ === jQuery underscore( js的一个函数库)  :   _     _.ea ...