【CPLUSOJ】【USACO】【差分约束】排队(layout)
【题目描述】
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)的更多相关文章
- Codevs 1242 布局 2005年USACO(差分约束)
1242 布局 2005年USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近 ...
- BZOJ1731:[USACO]Layout 排队布局(差分约束)
Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...
- [Usaco2005 dec]Layout 排队布局 差分约束
填坑- 差分约束一般是搞一个不等式组,求xn-x1的最大最小值什么的,求最大值就转化成xa<=xb+w这样的,然后建图跑最短路(这才是最终约束的),举个例子 x1<=x0+2x2<= ...
- bzoj 1731: [Usaco2005 dec]Layout 排队布局 ——差分约束
Description 当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些.FJ有N(2<=N<=1000)头奶牛,编号从1到N,沿一条直线站着等候喂食.奶牛排在队伍中的顺序和它们的编号是相 ...
- bzoj 1731 [Usaco2005 dec]Layout 排队布局——差分约束
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1731 对差分约束理解更深.还发现美妙博客:http://www.cppblog.com/me ...
- bzoj 1731 Layout 排队布局 —— 差分约束
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1731 差分约束: ML: dis[y] - dis[x] <= k,即 x 向 y 连 ...
- bzoj 1731: [Usaco2005 dec]Layout 排队布局【差分约束】
差分约束裸题,用了比较蠢的方法,先dfs_spfa判负环,再bfs_spfa跑最短路 注意到"奶牛排在队伍中的顺序和它们的编号是相同的",所以\( d_i-d_{i-1}>= ...
- 【POJ3169 】Layout (认真的做差分约束)
Layout Description Like everyone else, cows like to stand close to their friends when queuing for ...
- POJ 3169 Layout (图论-差分约束)
Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6574 Accepted: 3177 Descriptio ...
- POJ 3167 Layout(差分约束)
题面 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...
随机推荐
- redis入门(一)
目录 redis入门(一) 前言 特性 速度快 简单稳定 丰富的功能 历史 历史版本 安装与启动 安装 数据类型与内部编码 数据结构 内部编码 常用API与使用场景 常用命令 字符串 列表 哈希 集合 ...
- 让SpringBoot的jackson支持JavaBean嵌套的protobuf
问题背景 REST 项目使用protobuf 来加速项目开发,定义了很多model,vo,最终返回的仍然是JSON. 项目中一般使用 一个Response类, public class Respons ...
- 页面报错常用状态码总结(Http常见状态码)
作为一个互联网开发人员对于一些服务器返回的HTTP状态的意思都必须是了如指掌的,只有将这些状态码一一弄清楚,工作中遇到的各种问题才能够处理的得心应手.好了,下面就让我们来了解一下比较常见的HTTP状态 ...
- LeetCode刷题笔记(6)按照索引计算int[] 数组中的和([Time Limit Exceeded]问题)
Easy303 Easy633 package easy; public class e303 { private int[] sums; public e303(int[] nums) { sums ...
- JS设置和获取盒模型的宽和高
JS设置和获取盒模型的宽和高 dom.style.width/height:只能取出内联样式的宽度和高度 dom.currentStyle.width/height:获取即时的计算的样式,但是只有IE ...
- leetcode系列---Two Sum C#code
/// <summary> /// 方法一:双循环 /// </summary> /// <param name="array"></pa ...
- Feeling after reading《Jane Eyre》
Yesterday I read and listened over the book named <Jane Eyre>, the book is very thoughtful, th ...
- [2018-06-27] virtualenv
在开发Python应用程序的时候,系统安装的Python只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. 如果我们要同时开发多个应用程序,那这些 ...
- 基于 Jenkins Pipeline 自动化部署
最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置 ...
- 大数据之路week01--自学之集合_2(列表迭代器 ListIterator)
列表迭代器: ListIterator listerator():List集合特有的迭代器 该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法 特有功能: ...