【题目描述】
Robin喜欢将他的奶牛们排成一队。假设他有N头奶牛,编号为1至N。这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认为所有奶牛位于数轴上,那么多头奶牛的位置坐标可能相同)。

因为众所周知的原因,某些奶牛之间互相喜欢,他们希望互相之间的距离至多为一个定值。但某些奶牛之间互相厌恶,他们希望互相之间的距离至少为一个定值。现在给定ML个互相喜爱的奶牛对以及他们之间距离的最大值,MD个互相厌恶的奶牛对以及他们之间距离的最小值。

你的任务是计算在满足以上条件的前提下,帮助Robin计算出编号为1和编号为N的奶牛之间距离的最大可能值。

【输入格式】

第一行有 3 个整数,每两个整数之间用一个空格隔开,依次表示 n,ML和DL ;

此后ML行,每行包含三个用空格分开的整数A,B和D,其中A,B满足1<=A<=B<=N。表示编号为A和B的奶牛之间的距离至多为D。

此后MD行,每行包含三个用空格分开的整数A,B和D,其中A,B满足1<=A<=B<=N。表示编号为A和B的奶牛之间的距离至少为D。

【输出格式】

仅包含一个整数。如果不存在任何合法的排队方式,就输出-1。如果编号1和编号N的奶牛间距离可以任意,就输出-2 。否则输出他们之间的最大可能距离。

【输入样例】

4 2 1

1 3 10

2 4 20

2 3 3

【输出样例】

27

【数据范围】

对于40%的数据,N<=100;

对于100%的数据,N<=1000;ML,MD<=10000;D<=1000000。

【来源】
USACO

【解题思路】
经典的差分约束系统,由于要求最大值,根据不等式组解集的求法,符合条件的最大值正是不等号右边的最小值,所以要用最短路。
依题意可以得出两种不等式:
喜欢:B-A<=D
讨厌:B-A>=D
由于要使用最短路,所以统一符号采用小于等于号(根据最短路中的松弛原理d[e]<<d[s]+val[s,e]移项就可以得到这个结论)
所以把讨厌的不等式变成A-B>=−−D
接下来就是建图
把A和B看做图中的节点,权值为D,那么就形成一条有向边。
A→(权值为D)B
以此建图即可
【解题反思】
做的时候卡了很久,最后发现自己的SPFA出队忘记把出队的元素标记为未访问。
【参考程序】

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
long long n,l,h,cost[1001],a,b,c;
bool visit[1001];
struct data
{
long long e;
long long v;
};
vector<data> edge[2005];
long long cnt[1001];
void add(int sta,int end,int val)
{
data tmp;
tmp.e=end;
tmp.v=val;
edge[sta].push_back(tmp);
}
queue<int> que;
void First()
{
for (int i=1;i<=n;i++) cost[i]=0xfffffff;
cost[1]=0;
}
bool SPFA()
{
que.push(1);
visit[1]=true;
int f;
while (!que.empty())
{
f=que.front();
for (int i=0;i<edge[f].size();i++)
{
long long end=edge[f][i].e;
long long val=edge[f][i].v;
if (cost[end]>cost[f]+val)
{
cost[end]=cost[f]+val;
if (!visit[end])
{
visit[end]=true;
que.push(end);
}
cnt[end]++;//记录松弛次数
if (cnt[end]>=n) return true;//松弛n次就必然出现负环,无解
}
}
que.pop();
visit[f]=false;//打SPFA一定要记得写这句。
}
return false;
}
int main()
{
cin>>n>>l>>h;
for (int i=1;i<=l;i++)
{
cin>>a>>b>>c;
add(a,b,c);//建图
}
for (int j=1;j<=h;j++)
{
cin>>a>>b>>c;
add(b,a,-c);//建图
}
First();//初始化
if (SPFA()) printf("-1");//负环无解
else if (cost[n]==0xfffffff) printf("-2");//不连通
else cout<<cost[n]; //有解情况
return 0;
}

【CPLUSOJ】【USACO】【差分约束】排队(layout)的更多相关文章

  1. Codevs 1242 布局 2005年USACO(差分约束)

    1242 布局 2005年USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近 ...

  2. BZOJ1731:[USACO]Layout 排队布局(差分约束)

    Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...

  3. [Usaco2005 dec]Layout 排队布局 差分约束

    填坑- 差分约束一般是搞一个不等式组,求xn-x1的最大最小值什么的,求最大值就转化成xa<=xb+w这样的,然后建图跑最短路(这才是最终约束的),举个例子 x1<=x0+2x2<= ...

  4. bzoj 1731: [Usaco2005 dec]Layout 排队布局 ——差分约束

    Description 当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些.FJ有N(2<=N<=1000)头奶牛,编号从1到N,沿一条直线站着等候喂食.奶牛排在队伍中的顺序和它们的编号是相 ...

  5. bzoj 1731 [Usaco2005 dec]Layout 排队布局——差分约束

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1731 对差分约束理解更深.还发现美妙博客:http://www.cppblog.com/me ...

  6. bzoj 1731 Layout 排队布局 —— 差分约束

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1731 差分约束: ML: dis[y] - dis[x] <= k,即 x 向 y 连 ...

  7. bzoj 1731: [Usaco2005 dec]Layout 排队布局【差分约束】

    差分约束裸题,用了比较蠢的方法,先dfs_spfa判负环,再bfs_spfa跑最短路 注意到"奶牛排在队伍中的顺序和它们的编号是相同的",所以\( d_i-d_{i-1}>= ...

  8. 【POJ3169 】Layout (认真的做差分约束)

    Layout   Description Like everyone else, cows like to stand close to their friends when queuing for ...

  9. POJ 3169 Layout (图论-差分约束)

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6574   Accepted: 3177 Descriptio ...

  10. POJ 3167 Layout(差分约束)

    题面 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...

随机推荐

  1. SQL注入学习(一)

    SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击. SQL注入基础 漏洞原理 针对SQL注入的攻击行为可描述 ...

  2. MyBatis(4)-- 动态SQL

    如果使用JDBC或者类似于Hibernate的其他框架,很多时候要根据需要去拼装SQL,这是一个麻烦的事情.因为某些查询需要许多条件.通常使用其他框架需要大量的Java代码进行判断,可读性比较差,而M ...

  3. kubernetes实战(二十七):CentOS 8 二进制 高可用 安装 k8s 1.16.x

    1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.16.x,相对于其他版本,二进制安装方式并无太大区别.CentOS 8相对于CentOS 7操作更加方便,比如一些服务的关闭 ...

  4. 运用ffmpeg实现压缩视频

    /// <param name="filePath">ffmpeg.exe的文件路径</param> /// <param name="Pa ...

  5. 第三十五章 POSIX共享内存

    POSIX共享内存函数介绍 shm_open 功能: 用来创建或打开一个共享内存对象 原型: int shm_open(const char *name, int oflag, mode_t mode ...

  6. Scrapy爬虫day1——环境配置

    安装 Scrapy pip install scrapy 配置虚拟环境 mkvirtualenv Spider 创建项目 在Spider的虚拟环境中运行 scrapy startproject Boo ...

  7. TCP/IP协议指南

    分组: packet 通常用来表示任何类型的报文. 数据报: datagram 表示网络分层技术,它也经常用于表示在OSI参考模型较高层上的发送报文. 帧: frame 特别常见用于数据链路层上的报文 ...

  8. CSPS模拟 80

    题还没改完就来臭不要脸的写反思了. (主要因为太困了懒得改了) (还因为T2看起来太过弱智) (也许等我生物钟恢复正常后能当做课余消遣水一水) statistic:skyh接了两杯水,真能喝啊 然后他 ...

  9. 如何在Vue项目中使用Typescript

    0.前言 本快速入门指南将会教你如何在Vue项目中使用TypeScript进行开发.本指南非常灵活,它可以将TypeScript集成到现有的Vue项目中任何一个阶段. 1.初始化项目 首先,创建一个新 ...

  10. linux常用的命令解释

    1.man命令的操作按键: 按键 用处 空格键 向下翻一页. [Page Down] 向下翻一页. [Page Up] 向上翻一页. [HOME] 直接前往首页. [END] 直接前往尾页. /关键词 ...