题意:n头奶牛,ml对关系好的,md对关系不好的,关系好的必须在距离dl范围内,关系不好的必须在距离dd外,同一个地点可以有有多只奶牛,求第一头和最后一头的最大距离,特殊情况:无解输出-1,无限大输出-2。
分析:d[i+1]+0>=d[i],d[al]+dl>=d[bl],d[bd]+(-dd)>=d[ad],满足三个关系,构建了一个求最短路径图,由于存在负数的边,用bellman—ford算法。
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 10005
#define INF 0x7fffffff
int al[N],bl[N],dl[N],dd[N],ad[N],bd[N];
int n,ml,md;
int d[N];
void solve();
int main()
{
while(~scanf("%d%d%d",&n,&ml,&md))
{
for(int i=0;i<ml;i++)
{
scanf("%d%d%d",&al[i],&bl[i],&dl[i]);
}
for(int i=0;i<md;i++)
{
scanf("%d%d%d",&ad[i],&bd[i],&dd[i]);
}
solve();
}
return 0;
}
void solve()
{
fill(d,d+n,INF);
d[0]=0;
for(int k=0;k<n;k++){
for(int i=0;i<n-1;i++)
{
if(d[i+1]<INF)
d[i]=min(d[i],d[i+1]);
}
for(int i=0;i<ml;i++)
{
if(d[al[i]-1]<INF)
{
d[bl[i]-1]=min(d[bl[i]-1],d[al[i]-1]+dl[i]);
}
}
for(int i=0;i<md;i++)
{
if(d[bd[i]-1]<INF)
{
d[ad[i]-1]=min(d[ad[i]-1],d[bd[i]-1]-dd[i]);
}
}
}
int res=d[n-1];
if(d[0]<0)
res=-1;
else if(res==INF)
res=-2;
printf("%d\n",res);
}