MARK 用spfa判断是否存在负环

判断是否存在负环的方法有很多,

其中用spfa判断的方法是:如果存在一个点入栈两次,那么就存在负环。

细节想想确实是这样,按理来说是不存在入栈两次的如果边权值为正的话

这个算法是O(N*M)

还有一种方法是直接用bellman-ford,虽说spfa也就是bellman-ford+FIFO队列

而且bellman-ford还可以计算负环的值

顺手附上代码好了:

for(int i=0;i<n;i++) d[i]=INF;//初始化
d[0]=0;for(int k=0;k<n-1;k++)//迭代n-1次,目前不懂为什么for(int i=0;i<m;i++){//检查每条边int x=u[i],y=v[i];if(d[x]<INF) d[y]<?=d[x]+w[i];
}

这一题我是没有用bellman-ford...因为看到有人说用这个超时了= =

这里说一下用spfa的做法= =

虽然本蒟蒻第6个点莫名WA,但是毕竟思路还是正确的,自己MARK一下

目测是一些地方没有考虑到吧,据说有重边?有可能是这个?= =懒得管了

其实就是每个点都spfa一遍,看是否存在负环;

如果不存在的的话,就输出s-这些点的距离

至于spfa里面,其实也很简单,就是

 while(!q.empty()){int u=q.front();q.pop();vis[u]=false;for(int i=head[u];i!=-1;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);if(ans[v]<2){//这里用数组ans记录下,v这个点入栈几次ans[v]++;}else return true;}}}}

附上完整代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
const int maxn=101000;
int n,m,k,t,x,y,s,z,tot=0;
struct edge{int from,to,w,next;
}e[1010000];
int head[maxn],dist[maxn],ans[maxn];
bool vis[maxn];
int f[maxn];
bool flag;
void add(int x,int y,int z){e[tot].from=x;e[tot].to=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot++;
}
bool spfa(int s){queue<int>q;memset(dist,63,sizeof(dist));memset(vis,false,sizeof(vis));memset(ans,0,sizeof(ans));q.push(s);dist[s]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=false;for(int i=head[u];i!=-1;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);if(ans[v]<2){ans[v]++;}else return true;}}}}return false;
}
int main(){freopen("data.txt","r",stdin);scanf("%d%d%d",&n,&m,&s);memset(head,-1,sizeof(head));for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);add(x,y,z);if(x==y && z<0){printf("-1\n");return 0;}}   for(int i=1;i<=n;i++){if(spfa(i)){printf("-1\n");return 0;}}spfa(s);for(int i=1;i<=n;i++){if(dist[i]>1000000){if(i!=s) printf("NoPath\n");else printf("0\n");}else printf("%d\n",dist[i]);}return 0;
}

转载于:https://www.cnblogs.com/polebug/p/3907847.html

vijos1053 用spfa判断是否存在负环相关推荐

  1. 用SPFA判断是否存在负环

    题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 ...

  2. POJ 3259 Wormholes(bellman_ford,判断有没有负环回路)

    题意:John的农场里field块地,path条路连接两块地,hole个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts.我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前 ...

  3. bellman ford 算法 判断是否存在负环

    Flyer 目录视图 摘要视图 订阅 微信小程序实战项目--点餐系统        程序员11月书讯,评论得书啦        Get IT技能知识库,50个领域一键直达 关闭 bellman for ...

  4. F - Wormholes(判断是否存在负环)

    ##题目描述 While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A w ...

  5. 解题报告:luoguP2868 Sightseeing Cows G(最优比率环,负环判定,二分答案)

    根据题意,我们要环上各点权值之和除以各边权值之和最大. 求最大答案,很明显可以使用二分答案.那么我们假设当前答案为 x,如果有更大的答案,那么方程就可以按下图转换: 也就是说如果有更大的答案,则有一个 ...

  6. spfa判断负环( 负环判定 + spfa )

    给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible. 数据保证 ...

  7. 【最短路径问题笔记】SPFA算法及负环的判断

    dis数组:记录源点到每个结点最短路径值 in数组:记录结点进队次数 vis数组:记录结点是否在队列中 设立队列用来保存待优化的结点: 优化时每次取出队首结点cur,并且用cur点当前的最短路径对u点 ...

  8. 模板 - 判断负环(超时高效优化技巧)、01分数规划

    整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...

  9. 糖果(SPFA、判负环)

    Description 幼儿园里有 N 个小朋友,老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是 ...

  10. AcWing 904. 虫洞(SPFA or Djakarta or bellman判负环)

    题目连接 http://poj.org/problem?id=3259 思路 大概是想问我们能不能找到一个负环,那么再看一眼数据范围,500,感觉乱搞都能过,但是出题人很恶心啊,n的范围并不是500, ...

最新文章

  1. oracle和mysql存储汉字_mysql和oracle的一个汉字占几个字节
  2. java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...
  3. vue 取数组第一个值_vue遍历对象中的数组取值示例
  4. python是什么时候发布的_python发布日期
  5. 关于私有变量,静态私有变量
  6. 音乐、视频播放模式切换实现方案及原理解析(基于vue、vuex、h5 audio)
  7. Mybaties配置一对多关系sql实例
  8. 如何查看jar包的版本号?
  9. 100分制的成绩转换(C语言)(查表法)
  10. Android UI学习之CheckBox
  11. 汽车零配件行业MES系统,你了解多少?
  12. HTML5七夕情人节表白网页制作【雪花爱心】HTML+CSS+JavaScript 爱心代码 爱心制作 表白代码 告白网页制作
  13. 复利思维,您做到了吗?
  14. kettle整合kafka
  15. 坐标系统和glMatrix(GLM)
  16. 用java开发编译器之Thompson构造:正则表达式的词法解析
  17. 可见光波长和颜色的对应关系
  18. 3.图灵学院-----阿里/京东/滴滴/美团整理----高频JVM调优篇
  19. python怎么定义未知数_码如其人,同学你能写一手漂亮的Python函数吗
  20. 视频教程-Python开发全教程-Python

热门文章

  1. Spring Boot 2.0.3 修改 Servlet 容器(服务器)配置
  2. 使命召唤ol显示服务器超时,使命召唤ol网络延迟高的完整解决方案
  3. oracle 已知表名查询所属的schema_sql注入联合查询总结
  4. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-5.HttpClient4.x工具获取使用...
  5. javascript原型继承圣杯模式
  6. delphi const
  7. openssl 升级
  8. CF891E Lust 生成函数
  9. 在linux使用git的操作,几个问题解决
  10. Selenium+Python自动化测试学习问题总结笔记