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. 关于python requests 包跑ssl的设置 和 charles相关抓包的问题

    由于在测试服务器上测试东西都是https,然后最近又在和大神一起开发openapi,api写好当然是要测试的 python上测试接口最好用的莫过于requests模块了.但是 我还从来没有用reque ...

  2. html 背景

    用語設置背景的屬性 bgcolor設置背景顏色.可以使用名字.16進制和rgb三種形式的參數: <body bgcolor="#000000"> <body bg ...

  3. CSS兼容性详解

    前面的话 对于前端工程师来说,不想面对又不得不面对的一个问题就是兼容性.在几年之前,处理兼容性,一般地就是处理IE低版本浏览器的兼容性.而近几年,随着移动端的发展,工程师也需要注意手机兼容性了.本文将 ...

  4. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  5. 【BZOJ4555】求和(多种解法混合版本)

    [BZOJ4555]求和(多种解法混合版本) 题面 BZOJ 给定\(n\),求 \[f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}S(i,j)\times 2^j \times ...

  6. 【BZOJ1876】[SDOI2009]SuperGCD(数论,高精度)

    [BZOJ1876][SDOI2009]SuperGCD(数论,高精度) 题面 BZOJ 洛谷 题解 那些说数论只会\(gcd\)的人呢?我现在连\(gcd\)都不会,谁来教教我啊? 显然\(gcd\ ...

  7. 【Code Chef】April Challenge 2019

    Subtree Removal 很显然不可能选择砍掉一对有祖先关系的子树.令$f_i$表示$i$子树的答案,如果$i$不被砍,那就是$a_i + \sum\limits_j f_j$:如果$i$被砍, ...

  8. luogu1072 [NOIp2009]Hankson的趣味题 (数学+STL::set)

    一个JSB做法 由$\frac{x*b0}{gcd(x,b0)}=b1$,可得$\frac{x}{gcd(x,b0)}=\frac{b1}{b0}$ 设$b2=\frac{b1}{b0}$ 所以对$b ...

  9. java -server 和 -client 的不同,及 java -server 时抛错原因

    在dos窗口运行:java -server Error: missing `server' JVM at `C:\Program Files\Java\jre7\bin\server\jvm.dll' ...

  10. word中批量修改图片大小的两个方法

    前言: 对于把ppt的内容拷贝到word中: 对ppt的一页进行复制,然后粘贴到word中 如果要的是ppt运行过程中的内容,在qq运行的情况下,按Ctrl+Alt+A截屏,按勾,然后可以直接粘贴到w ...