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. 批处理版MPlayer播放器(甲兵时代原创批处理)(下)

    注意,由于空间不支持显示退格键,需要自己手动补上,方法如上图: 接上篇: 批处理版音视频播放器上(甲兵时代原创批处理) :Bc cls COLOR 2F echo. call :colour &quo ...

  2. ThreadLocal源码分析-黄金分割数的使用

    前提 最近接触到的一个项目要兼容新老系统,最终采用了ThreadLocal(实际上用的是InheritableThreadLocal)用于在子线程获取父线程中共享的变量.问题是解决了,但是后来发现对T ...

  3. CentOS使用465端口发送邮件

    1)邮件发送示例 方法1:echo "This is a test mail" | mail -s '邮件测试' 452666750@qq.com 方法2:mail -s '服务运 ...

  4. ELK-图示nginx中ip的地理位置

    一.环境准备: ELK stack 环境一套 geolite数据库文件 二.下载geolite数据库(logstash机器上解压,logstash需调用): geolite官网:https://dev ...

  5. zabbix的mysql优化后的配置文件

    zabbix的mysql数据库导致磁盘IO一直90%以上,访问卡的一逼 改了配置文件最后好了 [root@root /]# cat /etc/my.cnf [mysqld] datadir=/Data ...

  6. [Python]获取字典所有值

    方法一:Key Value 直接获取 databases = {1: 'Student', 2: 'School'} for k,v in databases.items(): print(k,v) ...

  7. 小程序在wxml页面格式化类似的2019-02-16T10:54:47.831000时间

    其实新建小程序的时候,会有一个util.js文件,这个文件里已经有时间格式化的方法了,可是它却不能再wxml页面调用, 不过wxml页面是支持引入.wxs文件的,我们重新写一个这样子的工具文件就解决了 ...

  8. win10打开自带wifi热点共享

    win10打开自带wifi热点共享 第一步,打开网络和Internet设置 二. 找到移动热点

  9. Flutter Widgets 之 InkWell 和 Ink

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 InkWell InkWell组件在用户点击时出现&quo ...

  10. 教你如何用Vue自己实现一个message插件

    今天我们来自己动手用实现一个message插件: Vue.js 的插件应该暴露一个 install 方法.这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象: //message. ...