图论——SPFA模板
来源:互联网 发布:java socket退出连接 编辑:程序博客网 时间:2024/06/08 11:29
SPFA是一种求最短路径的算法
SPFA的两种写法,bfs和dfs
判断有无负环:
如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图)
bfs判别负环不稳定,相当于限深度搜索,但是设置得好的话还是没问题的,
dfs的话判断负环很快
下面贴出dfs判负环代码(只能判负环,不能求最短路(隔壁机房得出))
//flag 是否有负环void DFS_SPFA(int u){ if(flag)return; vis[u]=true; for(int i=head[u];i;i=edge[i].to){ if(flag)return; int v=edge[i].v; if(d[u]+edge[i].t<d[v]){ d[v]=d[u]+edge[i].t; if(vis[v]){ flag=true; return ; }else{ DFS_SPFA(v); } } } vis[u]=false;}
spfa bfs求最短路模板
bfs的复杂度:
找出SPFA的最最坏到不可能的情况的复杂度为O(VE)。
其他情况O(玄学)【反正很快】
const int INF=1000000000;struct node{int to,v;};int n,m;int dis[M];bool mark[M];queue<int>q;vector<node>edge[M]; void spfa(int a){ FOR(i,1,n+1)dis[i]=INF; dis[a]=0; q.push(a); while(!q.empty()){ int x=q.front();q.pop(); mark[x]=0; FOR(i,0,edge[x].size()){ int y=edge[x][i].to; if(dis[y]>dis[x]+edge[x][i].v){ dis[y]=dis[x]+edge[x][i].v; if(!mark[y]){ q.push(y); mark[y]=1; } } } }}
用bfs判负环的时候,若进入负环n次后,说明有负环
阅读全文
0 0
- 图论——SPFA模板
- 模板整理——图论·最短路·spfa
- ACM模板——SPFA算法
- 单源最短路模板——SPFA
- SPFA———【模板】单源最短路径、租用游艇
- 最短路模板——dijkstra,SPFA(邻接表实现)
- C++——spfa和dijkstra算法模板
- 最小费用最大流(spfa增广)——模板整理
- spfa模板
- spfa 模板
- SPFA模板
- SPFA 模板
- Spfa模板
- spfa---模板
- SPFA(模板)
- spfa模板
- SPFA模板
- SPFA 模板
- C++拷贝构造函数(深拷贝,浅拷贝)详解
- Sql 编程
- CentOS 7 yum 安装MySQL
- 决策树算法
- LintCode-分治-寻找旋转排序数组中的最小值 II
- 图论——SPFA模板
- Mongodb学习笔记 --- python读取mongodb数据
- 出现找不到第三方库文件问题, invalid bitcode signature 不妨试试下面的方法
- 一只菜鸟的救赎
- Squeeze-and-Excitation Networks个人理解
- FileUtils工具类的使用
- 如何使用SQL语句进行简单的数据库操作?
- 子查询
- 剑指offer——62.二叉搜索树的第k个结点