题面链接
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]); }