题意:一些牛按序号排成一条直线,有两种要求,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 "); 73 else 74 { 75 if (dis[n]==INF) printf("-2 "); 76 else printf("%d ",dis[n]); 77 } 78 } 79 }