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. SpringMVC 进阶

    请求限制 一些情况下我们可能需要对请求进行限制,比如仅允许POST,GET等... RequestMapping注解中提供了多个参数用于添加请求的限制条件 value 请求地址 path 请求地址 m ...

  2. RC振荡电路

    RC振荡电路,由电阻R和电容C构成的适用于产生低频信号的电路 1.原理---简介 RC振荡电路,采用RC选频网络构成,适用于低频振荡,一般用于产生1Hz~1MHz(fo=1/2πRC)的低频信号.对于 ...

  3. CCF_ 201403-2_窗口

    用deque模拟. #include<iostream> #include<cstdio> #include<deque> using namespace std; ...

  4. CCF_ 201409-2_画图

    将一个数组比作画板,有颜色的位置标1,统计即可. #include<cstdio> #include<iostream> #define NUM 100 using names ...

  5. Springboot笔记(二)整合

    1.整合Freemarker 一种模板引擎,前端渲染模板的,类似于EL,jsp,不过比前两个好用 导入很简单   pom.xml <dependency> <groupId>o ...

  6. Python实现IOC控制反转

    思路: 用一个字典存储beanName和资源 初始化时先将beanName和资源注册到字典中 然后用一个Dscriptor类根据beanName动态请求资源,从而实现控制反转 # -*- coding ...

  7. Hexo搭建静态博客踩坑日记(一)

    前言 博客折腾一次就好, 找一个适合自己的博客平台, 专注于内容进行提升. 方式一: 自己买服务器, 域名, 写前端, 后端(前后分离最折腾, 不分离还好一点)... 方式二: 利用Hexo, Hug ...

  8. 修改定时清理 /tmp 目录下的文件

    初衷 默认系统是超过 30 天不访问的文件自动清除的,但是有时候硬盘用得紧可以考虑修改周期 设置方法 编辑配置文件:vim /etc/cron.daily/tmpwatch #! /bin/sh fl ...

  9. weblogic非正常关闭,<BEA-141281>错误

    在域下 find -name *.lok , 全删除: 在域下 find -name *.DAT,全删除: 然后就可以正常启动了

  10. absoulue与relative配合定位盒子居中问题

    如何通过absoulue与relative配合把一个盒子或者是把2个div块同时放到页面中央部分?定位完成后为什么又需要margin-left与margin-top各往回走50%的长度,别忘记用z-i ...