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. 如何利用开源解码项目开发js视频解码的web应用 系列

    介绍web上开发视频业务相关程序的技术演变历程 https://www.cnblogs.com/maoliangwu/articles/12046495.html 介绍ffmpeg asm.js we ...

  2. NLP新秀 - Bert

    目录 什么是Bert Bert能干什么? Bert和TensorFlow的关系 BERT的原理 Bert相关工具和服务 Bert的局限性和对应的解决方案 沉舟侧畔千帆过, 病树前头万木春. 今天介绍的 ...

  3. Go语言实现:【剑指offer】剪绳子

    该题目来源于牛客网<剑指offer>专题. 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],-,k[ ...

  4. XXE漏洞复现步骤

    XXE漏洞复现步骤 0X00XXE注入定义 XXE注入,即XML External Entity,XML外部实体注入.通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远 ...

  5. C++中类成员变量在初始化列表中的初始化顺序

    引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: class TestClass1 { public: TestClass1() { cout << ...

  6. Andriod you must restart adb and eclipse

    今天看着视频 学习着 andriod ,启动 的时候 竟然报错 我试了N种google来的方法,都失效,现在把我的解决方法告诉大家,希望能帮到大家. 首先,我先罗列下我搜到的方法,大家也可以尝试. 1 ...

  7. Ansible 学习目录

    1. Ansible 安装 2. Ansible hosts 文件配置 3. Ansible 常用模块 4. Ansible playbook使用

  8. linux web站点常用压力测试工具httperf

    一.工具下载&&安装 软件获取 ftp://ftp.hpl.hp.com/pub/httperf/ 这里使用的是如下的版本 ftp://ftp.hpl.hp.com/pub/httpe ...

  9. matplotlib如何画子图

    目录 前言 常用的两种方式 方式一:通过plt的subplot 方式二:通过figure的add_subplot 方式三:通过plt的subplots 如何不规则划分 前言 Matplotlib的可以 ...

  10. 修改kali软件源并配置网络

    一.配置kali使用xshell连接 查看ssh服务状态 # service ssh status 开启ssh服务 # service ssh start 修改ssh配置文件 # vi /etc/ss ...