1. 程式人生 > >洛谷 P4878 [USACO05DEC]layout布局

洛谷 P4878 [USACO05DEC]layout布局

差分 sizeof style span a+b ace ext tar efi

題面鏈接

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\n");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\n",dis[n]==dis[0]?-2:dis[n]); }

洛谷 P4878 [USACO05DEC]layout布局