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 授权

    1.“包装”意思是一个已经存在的对象进行包装,不管他是数据类型还是一段代码,可以是对一个已经存在的对象增加新的,删除不要的或者修改其他已经存在的功能 2.包装 包括定义一个类,他的实例拥有标准类型的核 ...

  2. HashMap的实现原理--链表散列

    1.    HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. ...

  3. Java微信二次开发(四)

    自定义文字菜单,暂时先实现一个根据用户输入城市名称来查询邮政编码和查询区号的功能 需要导入库:mysql-connector-java-5.0.8-bin.jar 第一步:利用Navicat新建一个用 ...

  4. Linux文件权限属性后面有个点

    坑啊,新上的机器,监控怎么都不好使,各种报错说:没有权限 什么情况? 仔细查看,发现文件权限属性后面怎么多了个点,类似如下: 这是什么? 原来: 开启了SELinux功能的Linux系统就会有这个点. ...

  5. 关于Spring MVC跨域

    1.Sping MVC 3.X跨域 关于跨域问题,主要用的比较多的是cros跨域. 详细介绍请看https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Ac ...

  6. codeforces518B

    Tanya and Postcard CodeForces - 518B 有个小女孩决定给他的爸爸寄明信片.她已经想好了一句话(即长度为n的字符串s),包括大写和小写英文字母.但是他不会写字,所以她决 ...

  7. First Knight UVALive - 4297(优化高斯消元解概率dp)

    题意: 一个矩形区域被分成 m*n 个单元编号为 (1, 1)至 (m, n),左上为 (1, 1),右下为(m, n).给出P(k)i,j,其中 1 ≤ i ≤ m,1 ≤ j ≤ n,1 ≤ k ...

  8. POJ3268(Silver Cow Party)

    题意: 有n头牛去第x个点开party(有点高大上~),单向路,去到还得回来,问这n头牛每一头花费的总时间的最大值是多少 模板spfa: #include <iostream> #incl ...

  9. SVM学习笔记-线性支撑向量机

    对于PLA算法来说,最终得到哪一条线是不一定的,取决于算法scan数据的过程. 从VC bound的角度来说,上述三条线的复杂度是一样的 Eout(w)≤Ein0+Ω(H)dvc= ...

  10. 沉迷AC自动机无法自拔之:[BZOJ2434] [Noi2011] 阿狸的打字机

    如标题所言,我已经沉迷于AC自动机无法自拔了... 这又是一道AC自动的题,红红火火恍恍惚惚 这题目做起来真舒服 简单概括一下:\(AC\)自动机\(fail\)树上树链剖分\(+\)树状数组 这种类 ...