題目
差分約束模板。
注意判負環須要建一個超級源點到每一個點連一條\(0\)的邊。由於\(1\)不必定能到達全部的點。c++
#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]); }