SPFA的卓越之处就在于处理多点稀疏图,因为点太多的话,我们直接用矩阵来存图的话是存不下的。

所以当我们用邻接矩阵来存图的话,我们就可以用SPFA来解决这类问题,spfa就是优化版的bellman-ford算法。

当我们无法对于单源最短路进行更新的话,说明所有的从起点出发的路已经都是最优了,这时候,我们的广搜也就结束了,

我们的spfa也就结束了。

我们从起点开始进入,然后选择和起点相邻的点,看看能否通过起点来更新,从起点到其它点的距离,如果可以,我们就让这下一个点进入队列,然后标记它在队列里面,然后我们再从下一个点进入,去更新其它的最短路。

这就是spfa,其实和dijkstra算法的主要核心思想并没有什么区别,只不过,spfa 要尝试去更新每条路,而不是像dijkstra一样,每次都去循环选择。

至于我们每次都让一个点只进入队列一次,原因就是在于我们每次只是选择一些我们可以更新的点,用这个可以更新的点,去更新其它点。



假设a点是原点,我们接着就让b和c入队列,我们通过b去更新的时候,发现c已经在队列里面了,我们对d[c]进行更新,看是否通过b点可以跟新c点,如果可以,就进行更新,更新之后发现c已经在队列里面了,我们就不添加c进入队列。

我们用完b之后,开始使用c点。

当我们用c去更新d,这时候就发现,因为d[c]是更新过的,如果可以更新,说明走b 更短,我们就可以通过c考虑走d是否更短,如果d[c]没有更新,就说明走b不短,所以我们就直接走c进行更新d,看看是否更短。

这时候我们可以知道,即使我们在更新b的时候,即使将c加入队列,也只是一种浪费资源的操作,所以,我们就不把c再次加入队列了。

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 100005;
const int INF = 0x7f7f7f7f;
vector<int> v1[maxn];
vector<int> v2[maxn];
int n, m, s, t;
int d[maxn],isque[maxn]; void spfa()
{
d[s] = 0;
queue<int> q;
q.push(s);
isque[s] = 1;
while (!q.empty()) {
int u = q.front();
q.pop();
isque[u] = 0;
for (int i = 0; i < v1[u].size();i++) {
int v = v1[u][i];
int len = v2[u][i];
if (d[v]>d[u]+len) {
d[v] = d[u] + len;
if (!isque[v]) {
q.push(v);
isque[v] = 0;
}
}
}
}
} int main()
{
scanf("%d%d%d%d", &n, &m, &s, &t);
int u, v, c;
for (int i = 0; i < m;i++) {
scanf("%d%d%d", &u, &v, &c);
v1[u].push_back(v);
v1[v].push_back(u);
v2[u].push_back(c);
v2[v].push_back(c);
}
memset(d, INF, sizeof(d));
memset(isque, 0, sizeof(isque));
spfa();
printf("%d\n", d[t]);
return 0;
}

hihoCoder-1093-SPFA的更多相关文章

  1. hihocoder 1093 SPFA算法

    题目链接:http://hihocoder.com/problemset/problem/1093 , 最短路的SPFA算法. 由于点的限制(10w),只能用邻接表.今天也学了一种邻接表的写法,感觉挺 ...

  2. [hihoCoder] #1093 : 最短路径·三:SPFA算法

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之 ...

  3. HihoCoder - 1093 小Hi和小Ho (SPFA)

    描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两 ...

  4. hihocoder 第二十五周 spfa 最短路

    其实hihocoder里的题目目前大都是模板题啊-.- 这周的是SPFA,暑假的时候有看过SPFA,不过一直用的都是Dijkstra,感觉spfa要更加简洁一点~~,今天找了一份之前一直都看不太懂所以 ...

  5. hiho(1081),SPFA最短路,(非主流写法)

    题目链接:http://hihocoder.com/problemset/problem/1081 SPFA求最短路,是不应-羁绊大神教我的,附上头像. 我第一次写SPFA,我用的vector存邻接表 ...

  6. hihocoder 1138 Islands Travel dijkstra+heap 难度:2

    http://hihocoder.com/problemset/problem/1138 很久不用最短路,几乎连基本性质也忘了,结果这道题就是某些最短路算法空间复杂度是o(n) 这里总结四种算法 算法 ...

  7. 【hihocoder 1424】 Asa's Chess Problem(有源汇上下界网络流)

    UVALive-7670 ICPC北京2016-C题 hihocoder 1424 题意 有个 \(N\times N\) 的棋盘,告诉你每个格子黑色(1)或白色(0),以及每对能相互交换的同行或同列 ...

  8. HDU 1069 Monkey and Banana / ZOJ 1093 Monkey and Banana (最长路径)

    HDU 1069 Monkey and Banana / ZOJ 1093 Monkey and Banana (最长路径) Description A group of researchers ar ...

  9. BZOJ 1093 最大半连通子图 题解

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2767  Solved: 1095[Submit][S ...

  10. 2018 Spring Single Training B (uva 572,HihoCoder 1632,POJ 2387,POJ 2236,UVA 10054,HDU 2141)

    这场比赛可以说是灰常的水了,涨信心场?? 今下午义务劳动,去拿着锄头发了将近一小时呆,发现自己实在是干不了什么,就跑到实验室打比赛了~ 之前的比赛补题补了这么久连一场完整的都没补完,结果这场比完后一小 ...

随机推荐

  1. IT兄弟连 JavaWeb教程 JSP中的三大指令

    指令标识主要用于设定整个JSP页面范围内都有效的相关信息,它是被服务器解释并执行的,不会产生任何内容输出到网页中.也就是说,指令标识对于客户端浏览器是不接见的.JSP页面的指令标识与我们的身份证类似, ...

  2. 【MySQL】全量+增量的备份/恢复

    生产环境中,有时需要做MySQL的备份和恢复工作.因MySQL是在运行过程中的,做全量备份需要时间,全量备份完成后又有数据变动,此时需要增量备份辅助.如果想恢复数据到一个空库(例如数据迁移或者上云等更 ...

  3. 后台管理系统·快速开发框架JSite

    平台介绍 框架基于Maven构建,拆分成多个子模块,层次结构清晰.可用于所有Web应用,如企业后台管理系统.OA系统.CMS.CRM等. 框架本身集成了最新的 Flowable工作流引擎 https: ...

  4. Java - Class版本号和UnsupportedClassVersionError

    问题分析 Java是向下兼容的,每一个jdk版本都有对应的class版本号(major + minor version numbers):如果用低版本的jvm去加载高版本jdk编译的类,就会报错:ja ...

  5. SpringBoot | 启动异常 | 显示bulid success 无 error信息

    可能原因是没有添加 web 依赖,检查pom里面是否有web <dependency> <groupId>org.springframework.boot</groupI ...

  6. VS2015 : error LNK1168

    VC在重新生成Debug目录下的exe文件时,需要先删除原先的exe文件.但因为文件正在运行或是被锁定等原因,删除不了,于是出现 LNK1168错误.可以到任务管理器先将exe文件关闭,一个简单粗暴的 ...

  7. Testing Complex Logic with JMeter Beanshell

    BeanShell是最先进的JMeter内置组件之一.JMeter具有丰富的内置插件,可满足性能测试的许多需求.例如,在编写一些复杂的测试时,您可能需要一些额外的脚本.在这种情况下,值得使用Beans ...

  8. zh-cn、en-us、zh-tw等表示语言(文化)代码与国家地区对照表(最全的各国地区对照表)

    af 公用荷兰语 af-ZA 公用荷兰语 - 南非 sq 阿尔巴尼亚 sq-AL 阿尔巴尼亚 -阿尔巴尼亚 ar 阿拉伯语 ar-DZ 阿拉伯语 -阿尔及利亚 ar-BH 阿拉伯语 -巴林 ar-EG ...

  9. 如何在spring环境中做单元测试

    在测试类的上方加入以下注解 @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:spring.xm ...

  10. Centos7中查看IP命令:IP addr

    Centos的IP地址是网卡的inet 的值,很明显第一个是本地服务地址,不是我们想要的.第二个没有inet这个属性值. 接下来配置网卡,我的网卡是上图黄色方框中第一行开始的那一部分:eno16777 ...