C++之路进阶——codevs4416(FFF的后宫)
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
一行,为最长的距离
样例输入 Sample Input
4 2 1
1 3 100
2 4 200
2 3 33
样例输出 Sample Output
267
数据范围及提示 Data Size & Hint
对于 40%的数据,n<=100
对于 100%的数据,n<=1000,m<=10000,从 1 开始编号,距离在 int 范围内
代码:
1 #include<cstdio> 2 #define INF 0x7fffffff 3 #define maxn 10000 4 #include<iostream> 5 6 using namespace std; 7 8 int n,ml,md,cnt=0; 9 10 struct cf 11 { 12 int to[maxn],a[maxn],next[maxn],head[maxn],w[maxn],q[maxn*2],tt[maxn]; 13 long long dis[maxn]; 14 bool vis[maxn]; 15 int insert(int u,int v,int ww) 16 { 17 to[++cnt]=v; next[cnt]=head[u]; head[u]=cnt; w[cnt]=ww; 18 } 19 cf() 20 { 21 scanf("%d%d%d",&n,&ml,&md); 22 for (int i=1;i<=ml;i++) 23 { 24 int u,v,w; 25 scanf("%d%d%d",&u,&v,&w); 26 insert(u,v,w); 27 } 28 for (int i=1;i<=md;i++) 29 { 30 int u,v,w; 31 scanf("%d%d%d",&u,&v,&w); 32 insert(v,u,-w); 33 } 34 for (int i=1;i<=n;i++) dis[i]=0x7fffffff; 35 } 36 int spfa() 37 { 38 int h=1,t=0; 39 q[0]=1; 40 vis[1]=1; 41 tt[1]++; 42 dis[1]=0; 43 while (t<h) 44 { 45 int now=q[t++]; 46 for (int i=head[now];i;i=next[i]) 47 { 48 49 if (dis[to[i]]>dis[now]+w[i]) 50 { 51 tt[to[i]]++; 52 if (tt[to[i]]==n+1) return 0; 53 dis[to[i]]=dis[now]+w[i]; 54 if (!vis[to[i]]) 55 { 56 vis[to[i]]=1; 57 q[h++]=to[i]; 58 } 59 } 60 } 61 vis[now]=0; 62 } 63 return 1; 64 } 65 void print() 66 { 67 if(!spfa()) printf("-1"); 68 else if(dis[n]==0x7fffffff) printf("-2"); 69 else printf("%lld\n",dis[n]); 70 } 71 72 }cf; 73 int main() 74 { 75 cf.print(); 76 return 0; 77 }