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=50005; 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=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,ch,a,b,c; inline int spfa(int u){ vis[u]=1; 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 0; if(!spfa(v)) return 0; } } vis[u]=0; return 1; } int main(){ n=read();m=read(); while(m--){ ch=read();a=read();b=read(); if(ch==1) c=read(),insert(b,a,c); else if(ch==2) c=read(),insert(a,b,-c); else if(ch==3) insert(a,b,0),insert(b,a,0); }rep(i,1,n) insert(0,i,0),dis[i]=-inf; if(!spfa(0)) printf("No"); else printf("Yes"); return 0; }