洛谷 P4878 [USACO05DEC]layout布局

时间:2022-04-26 16:01:58

题面链接

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=,inf=0x7fffffffffff;
int n,m1,m2,tot=,Next[N*],to[N*],val[N*],head[N*],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,); M(cnt,); M(dis,); dis[s]=; int i;
while(!q.empty())
{
int x=q.front(); q.pop(); inq[x]=; if(++cnt[x]>=n){printf("-1\n");exit();}
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]]=;
}
}
}
}
signed main()
{
int i,x,y,z; scanf("%lld%lld%lld",&n,&m1,&m2);
for(i=;i<=m1;i++)
{
scanf("%lld%lld%lld",&x,&y,&z); add(x,y,z);
}
for(i=;i<=m2;i++)
{
scanf("%lld%lld%lld",&x,&y,&z); add(y,x,-z);
}for(i=;i<=n;i++)add(,i,); spfa(); spfa();
printf("%lld\n",dis[n]==dis[]?-:dis[n]);
}