题意:一些牛按序号排成一条直线,有两种要求,A和B距离不得超过X,还有一种是A和B距离不得少于Y,问1和N可能的最大距离。

和poj那题一样,就是多了多组数据。

 1 #include<cstring>
 2 #include<cmath>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cstdio>
 6 #include<queue>
 7 #define INF 2000000007
 8 #define N 1007
 9 #define M 10007
10 using namespace std;
11 
12 int n,l,r;
13 int dis[N],num[N],ins[N];
14 int cnt,head[N],Next[M*3],rea[M*3],val[M*3];
15 
16 void add(int u,int v,int fee)
17 {
18     Next[++cnt]=head[u];
19     head[u]=cnt;
20     rea[cnt]=v;
21     val[cnt]=fee;
22 }
23 bool Spfa()
24 {
25     for (int i=1;i<=n;i++)
26         ins[i]=0,dis[i]=INF,num[i]=0;
27     queue<int>q;
28     q.push(1);dis[1]=0,num[1]=1;
29     while(!q.empty())
30     {
31         int u=q.front();q.pop();
32         for (int i=head[u];i!=-1;i=Next[i])
33         {
34             int v=rea[i],fee=val[i];
35             if (dis[v]>dis[u]+fee)
36             {
37                 dis[v]=dis[u]+fee;
38                 if (!ins[v])
39                 {
40                     num[v]++;
41                     ins[v]=1;
42                     q.push(v);
43                     if (num[v]>n) return false;
44                 }
45             }
46         }
47         ins[u]=0;
48     }
49     return true;
50 }
51 int main()
52 {
53     int T;scanf("%d",&T);
54     while(T--)
55     {
56         cnt=0;
57         memset(head,-1,sizeof(head));
58         scanf("%d%d%d",&n,&l,&r);
59         for (int i=1,x,y,z;i<=l;i++)
60         {
61             scanf("%d%d%d",&x,&y,&z);
62             add(x,y,z);
63         }
64         for (int i=1,x,y,z;i<=r;i++)
65         {
66             scanf("%d%d%d",&x,&y,&z);
67             add(y,x,-z);
68         }
69         for (int i=2;i<=n;i++)
70             add(i+1,i,0);    
71         bool flag=Spfa();
72         if (!flag) printf("-1\n");
73         else
74         {
75             if (dis[n]==INF) printf("-2\n");
76             else printf("%d\n",dis[n]);
77         }
78     }
79 }