此题求最短路径 即为A-B<=x;
建一条从B到A边权为x的路径
给的限制如果为 A-B>=x
转化成B-A<=-x;
跑spfa,求最短路径就好;
//最开始flag为全局变量,又定了个局部变量flag ,一直wa......
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int flag,tp=0,tov[200005],vis[1005],out[1005],tow[200005],nex[200005],h[1005],dis[1005],q[1000005],n,m,m1;
void add(int x,int y,int w)
{
tp++;
tov[tp]=y;
tow[tp]=w;
nex[tp]=h[x];
h[x]=tp;
}
void spfa( )
{
int tail=1,head=0;flag=0;
for(int i=1;i<=n;i++)
dis[i]=1e9;
memset(vis,0,sizeof(vis));
memset(out,0,sizeof(out));
memset(q,0,sizeof(q));
q[tail]=1;
dis[1]=0;
vis[tail]=1;
while(head<tail)
{
head++;
int x=q[head];
out[x]++;
if(out[x]>n)
{
flag=1;
return ;
}
for(int i=h[x];i;i=nex[i])
{
int v=tov[i];
if(dis[v]>dis[x]+tow[i])
{
dis[v]=dis[x]+tow[i];
if(vis[v]==0)
{
vis[v]=1;
tail++;
q[tail]=v;
}
}
}
vis[x]=0;
}
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&m1))
{
int tp=0;
memset(h,0,sizeof(h));
for(int i=1;i<=m;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
}
for(int i=1;i<=m1;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
add(y,x,(-1)*w);
}
spfa();
if(flag==1){cout<<"-1"<<endl; continue;}
if(dis[n]==1e9) cout<<"-2"<<endl;
else cout<<dis[n]<<endl;
}
return 0;
}