题目描述

原题来自:USACO 2005 Dec. Gold

FJ 有 n 头奶牛(2<=n<=1000) ,编号为1..n 。奶牛们将按照编号顺序排成一列队伍(可能有多头奶牛在同一位置上)。换句话说,假设 i 号奶牛位于 p_i,则 p_1<=p_2<=...<=p_n。

有些奶牛是好基友,它们希望彼此之间的距离小于等于某个数。有些奶牛是情敌,它们希望彼此之间的距离大于等于某个数。

给出 m_l 对好基友的编号,以及它们希望彼此之间的距离小于等于多少;又给出 m_d 对情敌的编号,以及它们希望彼此之间的距离大于等于多少  (1<=m_l,m_d<=1e4)。

请计算:如果满足上述所有条件,1 号奶牛和 n 号奶牛之间的距离(p_n-p_1)最大为多少。

输入格式

第一行:三个整数 n,m_l,m_d,用空格分隔。
第 2...m_l+1 行:每行三个整数 a,b,d,用空格分隔,表示P_b-p_a<=d 。
第 m_l+2.. m_l+m_d+1 行:每行三个整数 a,b,d,用空格分隔,表示P_b-p_a>=d 。
保证 1<=a<=b<=n,1<=d<=1e6 。

输出格式

一行,一个整数。如果没有合法方案,输出 -1. 如果有合法方案,但 1 号奶牛可以与 n 号奶牛相距无穷远,输出-2 . 否则,输出 1 号奶牛与 n 号奶牛间的最大距离。

样例
输入复制
4 2 1
1 3 10
2 4 20
2 3 3
输出复制
27

这四头牛分别位于 0,7,10,27。

______________________
 
差分约束
注意,1号店约束不到n好点,但是其余的点中间构成负环的情况!!!
如:
10 2 1
2 3 2
3 4 2
2 4 1012

______________________

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1010;
4 const int maxm=1e4+10;
5 int n,ml,md;
6 struct edge
7 {
8 int u,v,nxt;
9 long long w;
10 }e[maxm*4];
11 int head[maxn],js;
12 void addage(int u,int v,long long w)
13 {
14 e[++js].u=u;e[js].v=v;e[js].w=w;
15 e[js].nxt=head[u];head[u]=js;
16 }
17 long long dis[maxn];
18 bool inq[maxn];
19 deque<int>q;
20 int cs[maxn];
21 bool spfa()
22 {
23 memset(dis,0x3f,sizeof dis);
24 inq[0]=1;dis[0]=0;
25 q.push_back(0);++cs[0];
26 while(!q.empty())
27 {
28 int u=q.front();q.pop_front();inq[u]=0;
29 for(int i=head[u];i;i=e[i].nxt)
30 {
31 int v=e[i].v,w=e[i].w;
32 if(dis[v]>dis[u]+w)
33 {
34 dis[v]=dis[u]+w;
35 if(!inq[v])
36 {
37 inq[v]=1;++cs[v];
38 if(cs[v]>n)return 0;
39 if(!q.empty()&& dis[v]<=dis[q.front()])q.push_front(v);
40 else q.push_back(v);
41 }
42 }
43 }
44 }
45 return 1;
46 }
47 int main()
48 {
49 scanf("%d%d%d",&n,&ml,&md);
50 for(int i=1;i<n;++i)addage(i+1,i,0),addage(0,i,0x3f3f3f3f3f3f3f3f);
51 addage(0,1,0);
52 for(int a,b,d,i=1;i<=ml;++i)
53 {
54 scanf("%d%d%d",&a,&b,&d);
55 addage(a,b,d);
56 }
57 for(int a,b,d,i=1;i<=md;++i)
58 {
59 scanf("%d%d%d",&a,&b,&d);
60 addage(b,a,-d);
61 }
62 if(spfa()==0)puts("-1");
63 else if(dis[n]==0x3f3f3f3f3f3f3f3f)puts("-2");
64 else printf("%lld",dis[n]);
65
66 return 0;
67 }

LOJ10090的更多相关文章

随机推荐

  1. 【探索之路】机器人篇(5)-Gazebo物理仿真环境搭建_让机器人运动起来

    如果完成了前两步,那么其实我们已经可以去连接我们的现实中的机器人了. 但是,做机器人所需要的材料还没有到,所以我们这里先在电脑平台上仿真一下.这里我们用到的就算gazebo物理仿真环境,他能很好的和R ...

  2. mysql提权神器

    java -jar udf.jar 127.0.0.1 root 123456 [32/64]

  3. 前端面试题归类-css

    一.说下盒模型? 有两种盒模型,W3C盒模型和IE盒模型通常说的"IE盒子模型"指的是IE5.5,IE6及其以后,盒模型都为 content-box当浏览器未设置<!doct ...

  4. 基于jupyter lab搭建网页编程环境并添加自定义python kernel和matlab kernel以及plotly的使用

    内容转载自我的博客 目录 说明 1. 创建虚拟环境jupyter 2. 安装nodejs(用于jupyterlab安装扩展) 3. 安装pip包 4. 使用jupyterlab 5. 配置jupyte ...

  5. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB API实现)--学习笔记

    2.5.7 MongoDB -- API实现 问题查询单个实现 问题查询列表实现 问题跨集合查询实现 问题创建实现 问题更新实现 问题回答实现 问题评论实现 问题投票实现 回答实现 QuestionC ...

  6. NOIP初赛篇——09原码、反码和补码

    一.数的原码.补码和反码表示 机器数和真值 ​ 在计算机中,表示数值的数字符号只有0和1两个数码,我们规定最高位为符号位,并用0表示正符号,用1表示负符号.这样,机器中的数值和符号全"数码化 ...

  7. 经典项目管理 OR 敏捷项目管理,我该怎么选?

    CODING 项目协同近期为支持传统项目管理推出了「经典项目管理」.至此,CODING 已全面支持敏捷项目管理以及传统项目管理.那么问题来了,「经典项目管理」和「敏捷项目管理」,我该怎么选呢?本文将从 ...

  8. 【Java基础】基本语法-变量与运算符

    基本语法-变量与运算符 关键字和保留字 关键字定义:被 Java 语言赋予了特殊含义,用做专门用途的字符串(单词). 关键字特点:关键字中所有字母都为小写. 用于定义数据类型:class.interf ...

  9. 【Flutter】容器类组件之填充

    前言 Padding可以给其子节点添加填充(留白). 接口描述 class EdgeInsets extends EdgeInsetsGeometry { // 分别指定四个方向的填充 const E ...

  10. Redis Cluster 集群节点维护 (三)

    Redis Cluster 集群节点维护: 集群运行很久之后,难免由于硬件故障,网络规划,业务增长,等原因对已有集群进行相应的调整,比如增加redis nodes 节点,减少节点,节点迁移,更换服务器 ...