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;
}

 

posted @ 2018-08-27 21:47  ASDIC减除  阅读(133)  评论(0编辑  收藏  举报