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
",dis[n]); 
70             }     
71          
72    }cf;
73 int main()
74    {
75         cf.print();
76         return 0;
77      }  
原文地址:https://www.cnblogs.com/grhyxzc/p/5152919.html