bfs版spfa

void spfa(){
queue<int> q;
for(int i=;i<=n;i++) dis[i]=inf;
q.push();dis[]=;vis[]=;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v]){
vis[v]=;q.push(v);
}
}
}
}
}

dfs无优化版spfa

void spfa(int u){
instack[u]=;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!instack[v])
spfa(v);
else return;
}
}
instack[u]=;
}

dfs版spfa判断环

bool spfa(int u){
vis[u]=;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(dis[u]+w<dis[v]){
dis[v]=dis[u]+w;
if(vis[v]||!spfa(v))
return ;}
}vis[u]=;return ;
}

spfa判负环:luogu 3385

p.s:其实此题也是要先判连通性的,数据水过

1.bfs无优化版  O(n*m)    40

#include<bits/stdc++.h>

using namespace std;

const int inf=0x3f3f3f3f;
const int N=;
const int M=; int n,m,u,v,w,t;
int cnt[N],vis[N],head[N],dis[N],tot;
struct node{int v,w,next;}e[M];
void insert(int u,int v,int w){
e[++tot]=(node){v,w,head[u]};head[u]=tot;} int spfa(){
queue<int> q;
memset(dis,inf,sizeof(dis));
memset(vis,,sizeof(vis));
memset(cnt,,sizeof(cnt));
dis[]=;vis[]=;q.push();
while(!q.empty()){
int u=q.front();q.pop();cnt[u]++; if(cnt[u]>n) return ;
if(dis[u]==inf) continue;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(dis[u]+w<dis[v]){
dis[v]=dis[u]+w;
vis[v]=;
q.push(v);
}
}vis[u]=;
}
return ;
}
int main(){
cin>>t;
while(t--){
memset(head,,sizeof head);
memset(e,,sizeof e);
tot=;
cin>>n>>m;
for(int i=;i<=m;i++){
cin>>u>>v>>w;
insert(u,v,w);
if(w>=) insert(v,u,w);}
if(spfa()) printf("YE5\n");
else printf("N0\n");
}
return ;
}

2.bfs优化版(虽然思路清奇但是能AC就行)

更新p.s: 1.没有判连通性 2.无法处理有负边无负环的情况,cnt[v]=cnt[u]+1,并不通用

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define dec(i,x,y) for(register int i=x;i>=y;i--)
#define ll long long
using namespace std; const int N=20005;
const int M=100010;
const int inf=0x3f3f3f3f; inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}int n,m; int vis[N],dis[N],cnt[N],s=1; int head[N],tot;
struct node{int v,w,next;}e[M];
void insert(int u,int v,int w){
e[++tot]=(node){v,w,head[u]};head[u]=tot;} inline int spfa(){
queue<int> q;
memset(dis,inf,sizeof dis);
memset(vis,0,sizeof vis);
memset(cnt,0,sizeof cnt);
dis[s]=0;vis[s]=1;cnt[s]=1;
q.push(s);
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(dis[u]+w<dis[v]){
dis[v]=dis[u]+w;
if(!vis[v]){
cnt[v]=cnt[u]+1;
if(cnt[v]>=n) return 1;
vis[v]=1,q.push(v);
}
}
}
}return 0;
} int main(){
int t=read();
while(t--){
n=read();m=read();
memset(head,0,sizeof head);
tot=0;
for(int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
insert(u,v,w);
if(w>=0) insert(v,u,w);
}if(spfa()) printf("YE5\n");
else printf("N0\n");
}return 0;
}

3.dfs版,dis置0   0

#include<bits/stdc++.h>

using namespace std;

const int N=;
int t,n,m,cnt,dis[N],vis[N],head[N],fg;
struct node{int v,w,next;}e[N<<]; inline void insert(int u,int v,int w){
e[++cnt]=(node){v,w,head[u]};head[u]=cnt;} void spfa(int u){
vis[u]=;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(dis[v]>dis[u]+w){
if(vis[v]||fg){fg=;break;}
dis[v]=dis[u]+w;
spfa(v);
}
}vis[u]=;
}int a,b,w;
int main(){
cin>>t;
while(t--){
memset(dis,,sizeof dis);//dis置0
memset(vis,,sizeof vis);
memset(head,,sizeof head);
memset(e,,sizeof e);
cnt=;
cin>>n>>m;
for(int i=;i<=m;i++){
cin>>a>>b>>w;
insert(a,b,w);
if(w>=) insert(b,a,w);
}fg=;
for(int i=;i<=n;i++){
spfa(i);if(fg)break;}
if(fg) printf("YE5");
else printf("N0");
}return ;
}

4.dfs简单版

#include<bits/stdc++.h>
#define il inline
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
using namespace std;
const int N=,inf=;
int n,m,to[N],net[N],w[N],dis[N],cnt,h[N],tot[N];
bool vis[N]; il int gi(){
int a=;char x=getchar();
while(x<''||x>'')x=getchar();
while(x>=''&&x<='')a=(a<<)+(a<<)+x-,x=getchar();
return a;
} il void add(int u,int v,int c){to[++cnt]=v,net[cnt]=h[u],h[u]=cnt,w[cnt]=c;} il bool spfa(int u){
vis[u]=;
for(int i=h[u];i;i=net[i])
if(dis[to[i]]<dis[u]+w[i]){
dis[to[i]]=dis[u]+w[i];
if(vis[to[i]])return ;
if(!spfa(to[i]))return ;
}
vis[u]=;
return ;
} int main(){
n=gi(),m=gi();
int f,a,b,c;
while(m--){
f=gi(),a=gi(),b=gi();
if(f==)c=gi(),add(b,a,c);
else if(f==)c=gi(),add(a,b,-c);
else if(f==)add(a,b,),add(b,a,);
}
For(i,,n)add(,i,),dis[i]=-inf;
if(!spfa())cout<<"No";
else cout<<"Yes";
return ;
}

spfa判负环的更多相关文章

  1. POJ 3259 Wormholes(SPFA判负环)

    题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...

  2. Poj 3259 Wormholes(spfa判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...

  3. poj 1364 King(线性差分约束+超级源点+spfa判负环)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14791   Accepted: 5226 Description ...

  4. 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)

    传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...

  5. BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划

    BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...

  6. [P1768]天路(分数规划+SPFA判负环)

    题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了 ...

  7. LightOj 1221 - Travel Company(spfa判负环)

    1221 - Travel Company PDF (English) Statistics problem=1221" style="color:rgb(79,107,114)& ...

  8. poj 2049(二分+spfa判负环)

    poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...

  9. BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞 DFS版SPFA判负环

    Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...

随机推荐

  1. WMS与MES集成

    ERP的物流管理只偏重于帐务的管理,对现场实物流的及时性和精细程度管理均不够,无法满足企业日益精细化管理的需求,WMS可以弥补这个缺陷,WMS采用条码技术及时反应物流过程中的变化,同时将存量细化到货架 ...

  2. linux学习之centos(四):git的安装

    整个流程如下:(参考文章:linux安装git方法) [carsonzhu@localhost 桌面]$ wget https://github.com/git/git/archive/v2.8.3. ...

  3. __slots__用法以及优化

    其实也是无意之中又看到这个东西,这次索性再记一下,免得下次忘记又再看一遍,往复循环浪费了太多时间. __slots__其实我做项目这么久还没有主动使用过.下面reference有提到这么一句话 War ...

  4. 关于super的理解,三篇文章支撑起来的

    1.有向图的拓扑排序https://blog.csdn.net/wp1603710463/article/details/50900892 2. Python中MRO算法 http://mp.weix ...

  5. python 操作系统模块 -- OS

    os,语义为操作系统,模块提供了访问多个操作系统服务的功能,可以处理文件和目录这些我们日常手动需要做的操作.os和它的子模块os.path还包括一些用于检查.构造.删除目录和文件的函数,以及一些处理路 ...

  6. MT【56】2017联赛一试解答最后一题:一道复数题的几何意义

  7. Sublime text3 插件LiveReload 实现实时预览

    1.首先要安装插件LiveReload Sublime text3. 菜单 preferences->packages control,输入install.. 回车,输入LiveReload回车 ...

  8. suoi63 树与路径 (倍增lca)

    发现对于某一个点它向上发的一条边,它被经过的次数就是这个点子树数量*不是它子树的数量 那就维护一个前缀和,然后每次拿两个端点和它们的lca的值加一加减一减,再乘上加上的值,就是这次修改后答案的增量 ( ...

  9. C++ 容器:顺序性容器、关联式容器和容器适配器

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

  10. shell一些不为人知的技巧

    !$!$是一个特殊的环境变量,它代表了上一个命令的最后一个字符串.如:你可能会这样:$mkdir mydir$mv mydir yourdir$cd yourdir可以改成:$mkdir mydir$ ...