vijos1053 用spfa判断是否存在负环
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判断是否存在负环相关推荐
- 用SPFA判断是否存在负环
题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 ...
- POJ 3259 Wormholes(bellman_ford,判断有没有负环回路)
题意:John的农场里field块地,path条路连接两块地,hole个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts.我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前 ...
- bellman ford 算法 判断是否存在负环
Flyer 目录视图 摘要视图 订阅 微信小程序实战项目--点餐系统 程序员11月书讯,评论得书啦 Get IT技能知识库,50个领域一键直达 关闭 bellman for ...
- F - Wormholes(判断是否存在负环)
##题目描述 While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A w ...
- 解题报告:luoguP2868 Sightseeing Cows G(最优比率环,负环判定,二分答案)
根据题意,我们要环上各点权值之和除以各边权值之和最大. 求最大答案,很明显可以使用二分答案.那么我们假设当前答案为 x,如果有更大的答案,那么方程就可以按下图转换: 也就是说如果有更大的答案,则有一个 ...
- spfa判断负环( 负环判定 + spfa )
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible. 数据保证 ...
- 【最短路径问题笔记】SPFA算法及负环的判断
dis数组:记录源点到每个结点最短路径值 in数组:记录结点进队次数 vis数组:记录结点是否在队列中 设立队列用来保存待优化的结点: 优化时每次取出队首结点cur,并且用cur点当前的最短路径对u点 ...
- 模板 - 判断负环(超时高效优化技巧)、01分数规划
整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...
- 糖果(SPFA、判负环)
Description 幼儿园里有 N 个小朋友,老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是 ...
- AcWing 904. 虫洞(SPFA or Djakarta or bellman判负环)
题目连接 http://poj.org/problem?id=3259 思路 大概是想问我们能不能找到一个负环,那么再看一眼数据范围,500,感觉乱搞都能过,但是出题人很恶心啊,n的范围并不是500, ...
最新文章
- oracle和mysql存储汉字_mysql和oracle的一个汉字占几个字节
- java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...
- vue 取数组第一个值_vue遍历对象中的数组取值示例
- python是什么时候发布的_python发布日期
- 关于私有变量,静态私有变量
- 音乐、视频播放模式切换实现方案及原理解析(基于vue、vuex、h5 audio)
- Mybaties配置一对多关系sql实例
- 如何查看jar包的版本号?
- 100分制的成绩转换(C语言)(查表法)
- Android UI学习之CheckBox
- 汽车零配件行业MES系统,你了解多少?
- HTML5七夕情人节表白网页制作【雪花爱心】HTML+CSS+JavaScript 爱心代码 爱心制作 表白代码 告白网页制作
- 复利思维,您做到了吗?
- kettle整合kafka
- 坐标系统和glMatrix(GLM)
- 用java开发编译器之Thompson构造:正则表达式的词法解析
- 可见光波长和颜色的对应关系
- 3.图灵学院-----阿里/京东/滴滴/美团整理----高频JVM调优篇
- python怎么定义未知数_码如其人,同学你能写一手漂亮的Python函数吗
- 视频教程-Python开发全教程-Python
热门文章
- Spring Boot 2.0.3 修改 Servlet 容器(服务器)配置
- 使命召唤ol显示服务器超时,使命召唤ol网络延迟高的完整解决方案
- oracle 已知表名查询所属的schema_sql注入联合查询总结
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-5.HttpClient4.x工具获取使用...
- javascript原型继承圣杯模式
- delphi const
- openssl 升级
- CF891E Lust 生成函数
- 在linux使用git的操作,几个问题解决
- Selenium+Python自动化测试学习问题总结笔记