Luogu P4878 [USACO05DEC]布局

Posted cjoiershiina-mashiro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P4878 [USACO05DEC]布局相关的知识,希望对你有一定的参考价值。

题目
差分约束模板。
注意判负环需要建一个超级源点到每个点连一条(0)的边。因为(1)不一定能到达所有的点。

#include<bits/stdc++.h>
#define pi pair<int,int>
#define pb push_back
using namespace std;
int read(){int x;scanf("%d",&x);return x;}
const int N=1007,inf=0x3f3f3f3f;
vector<pi>E[N];int n,m1,m2,dis[N],vis[N],d[N];queue<int>q;
void add(int u,int v,int w){E[u].pb(pi(v,w));}
void spfa(int s)
{
    memset(dis,0x3f,sizeof dis),memset(vis,0,sizeof vis),memset(d,0,sizeof d),q.push(s),vis[s]=1,dis[s]=0;
    for(int u;!q.empty();)
    {
    u=q.front(),q.pop(),vis[u]=0;
    for(auto [v,w]:E[u])
            if(dis[u]+w<dis[v])
            {
        dis[v]=dis[u]+w,d[v]=d[u]+1;
        if(d[v]>=n) puts("-1"),exit(0);
                if(!vis[v]) vis[v]=1,q.push(v);
            }
    }
}
int main()
{
    n=read(),m1=read(),m2=read();
    for(int i=1;i<=n;++i) add(0,i,0);
    for(int i=1,a,b,d;i<=m1;++i) a=read(),b=read(),d=read(),add(a,b,d);
    for(int i=1,a,b,d;i<=m2;++i) a=read(),b=read(),d=read(),add(b,a,-d);
    spfa(0),spfa(1),printf("%d",dis[n]==inf? -2:dis[n]);
}

以上是关于Luogu P4878 [USACO05DEC]布局的主要内容,如果未能解决你的问题,请参考以下文章

P4878 [USACO05DEC]Layout G+P2294 [HNOI2005]狡猾的商人

Luogu6080 [USACO05DEC]Cow Patterns G

Luogu6080 [USACO05DEC]Cow Patterns G

[luogu P3065] [USACO12DEC]第一!First!

luogu P3110 [USACO14DEC]驮运Piggy Back

题解Luogu P3110 [USACO14DEC]驮运Piggy Back