最短路算法——SPFA
用途:
单源最短路径,不可以处理含负权边的图但可以用来判断是否存在负权回路;
复杂度O(kE) 【k <= 2, E 为边数】;
算法核心:
Bellman-Ford 算法的优化,实质与前算法一样,但优化的关键之处在于:只有那些前面被松弛过的点才有可能去松弛它们的邻接点。
模板(已优化):
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std; const int MAXN = 1e3 + ; struct edge
{
int t, nxt, cost;
}; edge e[MAXN*MAXN];
int head[MAXN], cnt;
int dis[MAXN];
bool vis[MAXN];
int N, M; void init()
{
memset(head, -, sizeof(head));
memset(e, , sizeof(e));
memset(vis, false, sizeof(vis));
fill(dis, dis+N+, INF);
cnt = ;
} void add(int from, int to, int weight)
{
e[cnt].t = to, e[cnt].cost = weight, e[cnt].nxt = head[from], head[from] = cnt++;
} void debug()
{
for(int i = ; i <= N; i++)
{
printf("%d ", i);
for(int k = head[i]; k != -; k = e[k].nxt)
printf(" -> %d ", e[k].t);
puts("");
}
puts("");
} void SPFA(int s)
{
deque<int> que;
que.push_back(s);
dis[s] = ;
vis[s] = true; while(!que.empty())
{
int u = que.front(); que.pop_front();
vis[u] = false; for(int i = head[u]; i != -; i = e[i].nxt)
{
int v = e[i].t;
if(dis[v] > dis[u] + e[i].cost)
{
dis[v] = dis[u] + e[i].cost;
if(!vis[v])
{
vis[v] = true;
if(!que.empty() && dis[v] < dis[que.front()])
que.push_front(v);
else
que.push_back(v);
}
}
}
}
} int main()
{
int a, b, c;
while(~scanf("%d%d", &M, &N)){
init();
while(M--)
{
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
add(b, a, c);
} ///debug(); SPFA(); printf("%d\n", dis[N]);
}
return ;
}
最短路算法——SPFA的更多相关文章
- 最短路算法 -- SPFA模板
一.算法步骤 建立一个队列,初始时队列里只有起始点,再建立一个数组记录起始点到所有点的最短路径(该数组的初始值要赋为极大值,该点到它本身的路径赋为0,下面的模板中该数组为dist[]).然后执行松弛操 ...
- 最短路算法--SPFA+嵌套map
hdu 2066 #include<iostream> #include<cstdio> #include<cstring> #include<queue ...
- 模板C++ 03图论算法 1最短路之单源最短路(SPFA)
3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...
- 【最短路算法】Dijkstra+heap和SPFA的区别
单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...
- 最短路算法详解(Dijkstra/SPFA/Floyd)
新的整理版本版的地址见我新博客 http://www.hrwhisper.me/?p=1952 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkst ...
- 最短路算法(floyed+Dijkstra+bellman-ford+SPFA)
最短路算法简单模板 一.floyed算法 首先对于floyed算法来说就是最短路径的动态规划解法,时间复杂度为O(n^3) 适用于图中所有点与点之间的最短路径的算法,一般适用于点n较小的情况. Flo ...
- 算法专题 | 10行代码实现的最短路算法——Bellman-ford与SPFA
今天是算法数据结构专题的第33篇文章,我们一起来聊聊最短路问题. 最短路问题也属于图论算法之一,解决的是在一张有向图当中点与点之间的最短距离问题.最短路算法有很多,比较常用的有bellman-ford ...
- 近十年one-to-one最短路算法研究整理【转】
前言:针对单源最短路算法,目前最经典的思路即标号算法,以Dijkstra算法和Bellman-Ford算法为根本演进了各种优化技术和算法.针对复杂网络,传统的优化思路是在数据结构和双向搜索上做文章,或 ...
- 图上最短路(Dijkstra, spfa)
单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来 ...
随机推荐
- Python+Selenium之通过batch跑脚本
例如在执行路径C:\Portal_Scripts\Scripts下的脚本CreateIndicativeBOP.py,可以在notepad里面编写如下: @echo off cd C:\Portal ...
- Java基础23-main方法
/* 主函数(主方法) 1.public(访问修饰符,公共的)代表类或者该函数访问权限是最大的 2.static 代表主函数随着类的加载就已经存在了 3.void 代表主函数没有具体的返回值 4.ma ...
- HTML问题 | 两个Input在同一行连着不留缝隙
方法1:让两个 input 连在一起写 不换行 <div class="inputDiv"> <input type="text" place ...
- vue懒加载 && 浏览器高度
当我们进入首页时,可能有很多条目需要显示,但是如果条目太多,我们全部将之显示出来就会造成性能的消耗,比如,我在第一条就找到了需要的或者我就看前面两条我就不想看后面的了,所以,这时候如果使用全部加载的方 ...
- Oracle 角色及其权限
一.简介 Oracle权限分为系统权限和对象权限. 1.系统权限 注意:系统权限不支持级联回收,所以你需要使用sysdba一个个的回收. 2.对象权限 注:对象权限支持级联回收,系统权限不支持级联回收 ...
- nyoj 364——田忌赛马——————【贪心】
田忌赛马 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Here is a famous story in Chinese history. "That ...
- Java学习第二十一天
1:字符流(掌握) (1)字节流操作中文数据不是特别的方便,所以就出现了转换流. 转换流的作用就是把字节流转换字符流来使用. (2)转换流其实是一个字符流 字符流 = 字节流 + 编码表 (3)编码表 ...
- C# this关键字的四种用法(转)
用法一 this代表当前类的实例对象 namespace Demo { public class Test { private string scope = "全局变量"; pu ...
- 一、IP地址
IP地址 1)网络地址 IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络. 2)广播地址 广播地址通常称为直接广播地址,是为了区分受限广播地址. 广播地址与网 ...
- Java - > for, while 及 do.while循环
为什么要用到循环结构: 按顺序结构执行程序语句(方法或者代码块)只能被执行一次.如果要多次执行,就需要使用到循环结构(循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构) 布尔表达式:是一段 ...