洛谷 P4878 [USACO05DEC]layout布局
阿新 • • 發佈:2018-10-03
差分 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布局