洛谷 P4878 [USACO05DEC]layout布局

题面链接

sol:差分约束系统裸题,根据a+b<=c建个图跑个最短路就没了。。。

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define int long long
#define M(a,v) memset(a,v,sizeof a)
const int N=10005,inf=0x7fffffffffff;
int n,m1,m2,tot=0,Next[N*2],to[N*2],val[N*2],head[N*2],dis[N],inq[N],cnt[N];
inline void add(int x,int y,int z)
{
    Next[++tot]=head[x]; to[tot]=y; val[tot]=z; head[x]=tot;
}
inline void spfa(int s)
{
    queue<int>q; q.push(s); M(inq,0); M(cnt,0); M(dis,63); dis[s]=0; int i;
    while(!q.empty())
    {
        int x=q.front(); q.pop(); inq[x]=0; if(++cnt[x]>=n){printf("-1
");exit(0);}
        for(i=head[x];i;i=Next[i])
        {
            if(dis[to[i]]>dis[x]+val[i])
            {
                dis[to[i]]=dis[x]+val[i]; if(!inq[to[i]]) q.push(to[i]),inq[to[i]]=1;
            }
        }
    }
}
signed main()
{
    int i,x,y,z; scanf("%lld%lld%lld",&n,&m1,&m2);
    for(i=1;i<=m1;i++)
    {
        scanf("%lld%lld%lld",&x,&y,&z); add(x,y,z);
    }
    for(i=1;i<=m2;i++)
    {
        scanf("%lld%lld%lld",&x,&y,&z); add(y,x,-z);
    }for(i=1;i<=n;i++)add(0,i,0); spfa(0); spfa(1);
    printf("%lld
",dis[n]==dis[0]?-2:dis[n]);
}
原文地址:https://www.cnblogs.com/gaojunonly1/p/9738759.html