洛谷P1993 小K的农场_差分约束_dfs跑SPFA

Code: 

#include<cstdio>
#include<queue>
using namespace std;
const int N=10000+233;
const int INF=10000000;
int head[N],to[N<<1],nex[N<<1],val[N<<1],vis[N],d[N];
int cnt;
void add_edge(int u,int v,int c)
{
    nex[++cnt]=head[u],head[u]=cnt;
    to[cnt]=v,val[cnt]=c;
}
int spfa(int u)
{
    vis[u]=1;
    for(int v=head[u];v;v=nex[v])
    {
        int x=to[v];
        if(d[u]+val[v]<d[x])
        {
             d[x]=d[u]+val[v];
            if(vis[x]==1)return 0;
            if(spfa(x)==0)return 0;
        }
    }
    vis[u]=0;
    return 1;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)d[i]=INF;
    for(int i=1;i<=m;++i)
    {
        int Ty,a,b,c;
        scanf("%d%d%d",&Ty,&a,&b);
        if(Ty!=3)scanf("%d",&c);
        if(Ty==1)
            add_edge(a,b,-c);
        if(Ty==2)
            add_edge(b,a,c);
        if(Ty==3)
        {
            c=0;
            add_edge(b,a,c);
            add_edge(a,b,-c);
        }
    }
    int ans=1;
    for(int i=1;i<=n;++i)
    {
        if(vis[i]==0)
            if(!spfa(i))
            {
                ans=0;break;
            }
    }
    if(ans==0)printf("No");
    else printf("Yes");
    return 0;
}

  

原文地址:https://www.cnblogs.com/guangheli/p/9845152.html