luogu 1993 小K的农场

时间:2023-03-09 06:24:04
luogu 1993 小K的农场

差分约束+spfa判负环

dfs判负环

#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=;
const int inf=0x3f3f3f3f; int dis[N],vis[N],head[N],tot;
struct node{int v,w,next;}e[N];
void insert(int u,int v,int w){
e[++tot]=(node){v,w,head[u]};head[u]=tot;} inline int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;
}
int n,m,ch,a,b,c; inline int 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){
dis[v]=dis[u]+w;
if(vis[v]) return ;
if(!spfa(v)) return ;
}
}
vis[u]=;
return ;
} int main(){
n=read();m=read();
while(m--){
ch=read();a=read();b=read();
if(ch==) c=read(),insert(b,a,c);
else if(ch==) c=read(),insert(a,b,-c);
else if(ch==) insert(a,b,),insert(b,a,);
}rep(i,,n) insert(,i,),dis[i]=-inf;
if(!spfa()) printf("No");
else printf("Yes");
return ;
}