Luogu1993 small farms K

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

int n,m,cnt,head[100005],vis[100005],dis[100005];

struct edge{
    int v,w,next;
}e[1000005];

inline void add(int u,int v,int w){
    e[++cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[u];
    head[u]=cnt;
}

inline bool spfa(int u){
    vis[u]=1;
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].v;
        if(dis[v]<dis[u]+e[i].w){
            dis[v]=dis[u]+e[i].w;
            if(vis[v])return 0;
            if(!spfa(v))return 0;
        }
    }
    vis[u]=0;
    return 1;
}

int main(){
    memset(head,-1,sizeof(head));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int flag,a,b,c;
        scanf("%d",&flag);
        if(flag==1){
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,-c);
        }
        else if(flag==2){
            scanf("%d%d%d",&a,&b,&c);
            add(b,a,c);
        }
        else{
            scanf("%d%d",&a,&b);
            add(a,b,0);add(b,a,0);
        }
    }
    for(int i=1;i<=n;i++){
        add(0,i,0);
        dis[i]=-2147483647;
    }
    if(spfa(0))printf("Yes\n");
    else printf("No\n");
}

Guess you like

Origin www.cnblogs.com/Y15BeTa/p/10992728.html