模板C++ 03图论算法 1最短路之单源最短路(SPFA)
3.1最短路之单源最短路(SPFA)
松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离。
邻接表:表示与一个点联通的所有路。
如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于0,
就说这条路是一个负权回路。
回归正题,SPFA是bellman-ford的一种改进算法,由1994年西安交通大学段凡丁提出。它无法处理带有负环的图,判断方法:如果某个点进入队列的次数超过N次则存在负环。
SPFA的两种写法,bfs和dfs,bfs判别负环不稳定,相当于限深度搜索,但是设置得好的话还是没问题的,dfs的话判断负环很快(我也看不懂,推介宽艘)。
int n; //表示n个点,从1到n标号
int s,t; //s为源点,t为终点
int d[N]; //d[i]表示源点s到点i的最短路
bool vis[N]; //vis[i]=1表示点i在队列中
queue<int>q; //队列
int spfa_dfs(int u)
{
vis[u]=true;
;k=e[k].next)
{
int v=e[k].v,w=e[k].w;
if(d[v]>d[u]+w)
{
d[v]=d[u]+w;
if(vis[v]) return true;
else if(spfa_dfs(v)) return true;
}
}
vis[u]=false;
}
Bfs版:
/*
给出一个有N个节点,M条边的带权有向图.判断这个有向图中是否存在负权回路.
如果存在负权回路, 只输出一行-1;
如果不存在负权回路,再求出一个点S到每个点的最短路的长度.
约定:S到S的距离为0,如果S与这个点不连通,则输出NoPath.
点数N,边数M,源点S;以下M行,每行三个整数a,b,c表示点a,b之间连有一条边,权值为c
如果存在负权环,只输出一行-1,否则按以下格式输出共N行,第i行描述S点到点i的最短路:
如果S与i不连通,输出NoPath;如果i=S,输出0;其他情况输出S到i的最短路的长度
INPUT:
6 8 1
1 3 4
1 2 6
3 4 -7
6 4 2
2 4 5
3 6 3
4 5 1
3 5 4
OUTPUT:
0 6 4 -3 -2 7*/
#include<cstdio>
using namespace std;
struct point
{
int ans; //距离源点的最短距离
int lson; //最后的儿子
int p; //被放进序列(list)的次数统计
int v; //是否在序列(list)中
}a[];
struct road
{
int x,y,c,g;//起点、终点、长度和哥哥
}b[];
void BuildRoad(void);
void ShortRoad(int);
],n,m,s,k;//路的数量
bool bo;
int main()
{
scanf("%d %d %d",&n,&m,&s);
k=;
;i<=n;i++) a[i].lson=;//放在建路之前
;i<=m;i++) BuildRoad();
bo=true;
;i<=n;i++)
{
ShortRoad(i);//寻找负权回路
if(bo==false)
{
printf("-1");
;
}
}
ShortRoad(s);
;i<=n;i++)
) printf("NoPath\n");
else printf("%d\n",a[i].ans);
}
void BuildRoad(void)
{
int x,y,c;
scanf("%d %d %d",&x,&y,&c);
k++;
b[k].x=x;
b[k].y=y;
b[k].c=c;
b[k].g=a[x].lson;
a[x].lson=k;
}
void ShortRoad(int st)
{
;i<=n;i++)
{
a[i].ans=;
a[i].p=;a[i].v=;
}
a[st].ans=; a[st].p=;
a[st].v=]=st;
//放入序列中
,wei=;
) wei=;//循环数组
while(tou!=wei)
{
int x=list[tou];
;i=b[i].g)
{
int y=b[i].y;
if(a[y].ans>a[x].ans+b[i].c)
{
a[y].ans=a[x].ans+b[i].c;//松弛
if(a[y].v==false)//如果还没有放入
{
a[y].p++;
if(a[y].p>n)
{
bo=false;return;
}
a[y].v=;list[wei++]=y;
) wei=;
}
}
}
a[x].v=false; tou++;
) tou=;
}
}
进阶:
【宽搜高级利用】最后的战犯
【两个人,一步一步。。。。】
最短路变例
【坐标计算】
【宽搜变例】【按照一定次序】密室逃脱
【bfs+dfs】
[JSOI2008]星球大战StarWar
【并查集+最短路】
模板C++ 03图论算法 1最短路之单源最短路(SPFA)的更多相关文章
- 模板C++ 03图论算法 2最短路之全源最短路(Floyd)
3.2最短路之全源最短路(Floyd) 这个算法用于求所有点对的最短距离.比调用n次SPFA的优点在于代码简单,时间复杂度为O(n^3).[无法计算含有负环的图] 依次扫描每一点(k),并以该点作为中 ...
- Fire-Fighting Hero(多源最短路和单源最短路)
题:https://nanti.jisuanke.com/t/41349 分析:对于hero来说,走单源最短路,然后遍历dis数组中的最大值即可找到,对于消防员来说,走多源最短路,只需要建个超级起点连 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- 图论-单源最短路-SPFA算法
有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...
- 2018/1/28 每日一学 单源最短路的SPFA算法以及其他三大最短路算法比较总结
刚刚AC的pj普及组第四题就是一种单源最短路. 我们知道当一个图存在负权边时像Dijkstra等算法便无法实现: 而Bellman-Ford算法的复杂度又过高O(V*E),SPFA算法便派上用场了. ...
- 单源最短路模板(dijkstra)
单源最短路(dijkstra算法及堆优化) 弱化版题目链接 n^2 dijkstra模板 #include<iostream> #include<cstdio> #includ ...
- 用scheme语言实现SPFA算法(单源最短路)
最近自己陷入了很长时间的学习和思考之中,突然发现好久没有更新博文了,于是便想更新一篇. 这篇文章是我之前程序设计语言课作业中一段代码,用scheme语言实现单源最段路算法.当时的我,花了一整天时间,学 ...
- 【算法】单源最短路——Dijkstra
对于固定起点的最短路算法,我们称之为单源最短路算法.单源最短路算法很多,最常见的就是dijkstra算法. dijkstra主要用的是一种贪心的思想,就是说如果i...s...t...j是最短路,那么 ...
随机推荐
- C#图解教程-方法参数笔记(上)
一晃大学四年要过去了,期间乱点了很多技能点, 导致每一项技能都只是处于入门阶段.为了将C#作为我的主要技能,准备恶补相关姿势(知识),通过各种技术论坛的推荐,找到了<C#图解教程>这本书. ...
- MTK elian(smartlink)在WIN32下的实现
先说明一下调试技巧:该程序需无线网卡实现功能,由于PC端有可能是多网卡的(有线网卡.无线网卡.虚拟网卡),所以在发包的时候数据包不一定会从无线网卡出,lib库应该也没处理多网卡的选择吧.所以在调试的时 ...
- script defer和async一探
今天几经折腾,终于回家了,最近公司上的事忙了好一阵子,终于可以闲下来,重新在整理一下,又重新了解了一下defer和async在页面加载过程差异. 定义和用法 async 属性规定一旦脚本可用,则会异步 ...
- java线程的实现
一共有两种方法Thread类和Runnable接口,相对来讲,更趋向于用Runnable因为一个类可以实现多个接口,但是只能继承一个类,所以相对来说倾向用Runnable 第一种方法:用Thread其 ...
- mySql 安装教程
看了好久别人的文章,今天就开始自己写第一篇.希望给别人能提供帮助,也可以方便自己查阅. 前两天自己安装了mysql,感觉是比oracle好装多了. mysql安装有两种方式,一种是安装包安装方式,一种 ...
- 树型权限管理插件:jQuery Tree Multiselect详细使用指南
1.认识jQuery Tree Multiselect 这个插件允许用户以树型的形式来呈现列表复选框的选择.多用于权限管理中用于分配不同的权限.使用文档,请参考: https://github ...
- TypeScript入门-枚举、类型推论
枚举 使用枚举可以定义一些具有名字的数字常量,和在C语言中一样都是使用关键字enum enum Direction { Up = 1, Down = 1<<2, Left, Right } ...
- Vue H5 History 部署IIS上404问题
背景简介 vue使用vue-router时,默认的地址并不美观,以#进行分割,例如:http://www.xxx.com/#/main. 为了访问地址能像正常的url一样,例如:http://www. ...
- js修改样式表规则
<div>adasfsfs</div> <div id="div">adasfsfs</div> <div>adasfs ...
- YAHOO 34 条前端优化建议
雅虎团队经验:网站页面性能优化的34条黄金守则 1.尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容.这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通 ...