当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些。FJ有N(2<=N<=1000)头奶牛,编号从1到N,沿一条直线站着等候喂食。奶牛排在队伍中的顺序和它们的编号是相同的。因为奶牛相当苗条,所以可能有两头或者更多奶牛站在同一位置上。即使说,如果我们想象奶牛是站在一条数轴上的话,允许有两头或更多奶牛拥有相同的横坐标。
一些奶牛相互间存有好感,它们希望两者之间的距离不超过一个给定的数L。另一方面,一些奶牛相互间非常反感,它们希望两者间的距离不小于一个给定的数D。给出ML条关于两头奶牛间有好感的描述,再给出MD条关于两头奶牛间存有反感的描述。(1<=ML,MD<=10000,1<=L,D<=1000000)
你的工作是:如果不存在满足要求的方案,输出-1;如果1号奶牛和N号奶牛间的距离可以任意大,输出-2;否则,计算出在满足所有要求的情况下,1号奶牛和N号奶牛间可能的最大距离。
第一行:三个空间分隔的整数:N,ML,和MD
第二行至第ML+1行:每行包含三个空间分隔的正整数:A,B和D,其中1<=
A<=N。表示牛A和牛B必须在距离D以内。第ML+2至第ML+MD+1行:每行包含三个空间分隔的正整数:A,B和D,其中1 <=
A<=N。表示牛A和牛B必须在距离D以上。
输出仅有一个整数。如果不可能安排奶牛的布局,输出-1。如果奶牛1和奶牛N可以相距任意距离,输出-2。否则输出奶牛1和奶牛N之间的最大距离。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f,n,ml,md,nxt[100000],to[100000],c[100000],h[1111],que[10000000],H,T,k,d[1111];
bool inq[1111];int cnt[1111];
void ins(int u,int v,int t){nxt[++k]=h[u];to[k]=v;c[k]=t;h[u]=k;}
int spfa()
{
memset(inq,0,sizeof(inq));memset(cnt,0,sizeof(cnt));memset(d,127,sizeof(d));int INF=d[1];
d[1]=0;inq[1]=1;cnt[1]++;H=0;T=0;que[T++]=1;
while(H<T)
{
int u=que[H++];inq[u]=0;
for(int i=h[u];i;i=nxt[i])
{
int v=to[i],t=c[i];
if(d[v]>d[u]+t)
{
d[v]=d[u]+t;cnt[v]++;
if(cnt[v]>n)return -1;
if(!inq[v])inq[v]=1,que[T++]=v;
}
}
}
if(d[n]==INF)return -2;
return d[n];
}
int main()
{
scanf("%d%d%d",&n,&ml,&md);
for(int i=1;i<n;i++)ins(i+1,i,0);
for(int i=1;i<=ml;i++)
{
int u,v,C;scanf("%d%d%d",&u,&v,&C);ins(u,v,C);
}
for(int i=1;i<=md;i++)
{
int u,v,C;scanf("%d%d%d",&u,&v,&C);ins(v,u,-C);
}
printf("%d",spfa());
return 0;
}