/*

4416 FFF 团卧底的后宫

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述 Description

你在某日收到了 FFF 团卧底的求助,在他某日旅游回来,他的后宫们出现了一些不可调和的矛盾,如果 FFF 团卧底把自己的宝贝分给 a 号妹子,那么 b 号妹子至少要在站在 a 号妹子的右边距离 d,妹子才愿意得到那个宝贝。可是后宫里也有玩得好的妹子呀,她们总是渴望亲近一点,如果把自己的宝贝分给 a 号妹子,那么与她亲近的妹子与 a 号妹子的距离不会超过 l。现在总共有 n 个妹子,k 个这样的矛盾关系,m 个亲近关系。假设他的宝贝是无限的,保证每一个妹子都有宝贝的情况下,第 n 个妹子和第一个妹子的最远距离是多少呢?

输入描述 Input Description

第一行为 n,m,k

此后 m 行为亲近关系

此后 k 行为矛盾关系

输出描述 Output Description

一行,为最长的距离*/

//差分约束  如果x与y之间距离小于k,建一条x到y权值为k的边;如果x与y之间距离大于k,建一条y到x权值为-k的边;
#include<cstdio> #include<iostream> #define M 99999999 using namespace std; int cnt,n,m1,m2,head[1005],next[40005],u[40006],f[1005],t[1005],b[1005]; long long d[1005],v[40005]; int ha,ta; void jia(int a1,int a2,int a3) { cnt++; next[cnt]=head[a1]; head[a1]=cnt; u[cnt]=a2; v[cnt]=a3; return; } int main() { int a1,a2,a3; scanf("%d%d%d",&n,&m1,&m2); for(int i=1;i<=m1;i++) { scanf("%d%d%d",&a1,&a2,&a3); jia(a1,a2,a3); } for(int i=1;i<=m2;i++) { scanf("%d%d%d",&a1,&a2,&a3); jia(a2,a1,-a3); } for(int i=2;i<=n;i++) d[i]=M; ta=1; f[1]=1; t[1]++; b[1]=1; for(;ha!=ta;) { ha++; if(ha>1002) ha=1; b[f[ha]]=0; for(int i=head[f[ha]];i;i=next[i]) if(d[u[i]]>d[f[ha]]+v[i]) { d[u[i]]=d[f[ha]]+v[i]; t[u[i]]++; if(t[u[i]]==n+1) { printf("-1"); return 0; } if(!b[u[i]]){ta++; if(ta>1002) ta=1; b[u[i]]=1; f[ta]=u[i];} } } if(d[n]==M) printf("-2"); else printf("%lld",d[n]); return 0; }
posted on 2016-01-23 15:19  xiyuedong  阅读(174)  评论(0编辑  收藏  举报