x个约束条件,dis[B]-dis[A]<=C
y个约束条件,dis[A]-dis[B]>=C,即dis[B]-dis[A]<=-C
答案分三种情况,1.no line-up is possible 即无解,输出-1;2.1 and N can be arbitrarily far apart,即dis[n]无限制,dis[n]=INF,输出-2,其他输出答案
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#define N 1005
#define INF 1<<29
#include<queue>
using namespace std;
int x,y,cnt,head[N],vis[N],dis[N],index[N];
struct edge{
int v,next,w;
}e[N*100];
void init(int n){
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1;i<=n;i++){
dis[i]=INF;
}
}
void addedge(int u,int v,int w){
e[cnt].v=v;e[cnt].w=w;e[cnt].next=head[u];head[u]=cnt++;
}
bool SPFA(int u,int n){
queue<int> q;
memset(index,0,sizeof(index));
memset(vis,0,sizeof(vis));
int i,v,w,sum=0;
vis[u]=1;
dis[u]=0;
q.push(u);
while(!q.empty()){
u=q.front();
q.pop();
vis[u]=0;
for(i=head[u];i!=-1;i=e[i].next){
v=e[i].v;
w=e[i].w;
if(dis[u]+w<dis[v]){
dis[v]=dis[u]+w;
if(!vis[v]){
q.push(v);
vis[v]=1;
if(++index[v]>n)
return false;
}
}
}
}
return true;
}
int main()
{
int t,n,i,u,v,w,flag;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&x,&y);
init(n);
for(i=0;i<x;i++){
scanf("%d%d%d",&u,&v,&w);
if(u>v)
swap(u,v);
addedge(u,v,w);
}
while(y--){
scanf("%d%d%d",&u,&v,&w);
if(u>v)
swap(u,v);
addedge(v,u,-w);
}
for(i=1;i<n;i++)
addedge(i+1,i,0);
if(SPFA(1,n)){
for(i=1;i<=n;i++){
if(dis[i]==INF)
break;
}
if(i!=n+1){
printf("-2\n");
}else {
printf("%d\n",dis[n]);
}
}else {
printf("-1\n");
}
}
return 0;
}