【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 ...
随机推荐
- vue 开发插件流程
UI demo UI 插件汇总 我的github iSAM2016 在练习写UI组件的,用到全局的插件,网上看了些资料.看到些的挺好的,我也顺便总结一下写插件的流程: 声明插件-> 写插件-&g ...
- 基于TORCS和Torch7实现端到端连续动作自动驾驶深度强化学习模型(A3C)的训练
基于TORCS(C++)和Torch7(lua)实现自动驾驶端到端深度强化学习模型(A3C-连续动作)的训练 先占坑,后续内容有空慢慢往里填 训练系统框架 先占坑,后续内容有空慢慢往里填 训练系统核心 ...
- 记录面试龙腾简合-java开发工程师经历
/** * ############ * 变强是会掉光头发的!现在的头发还是很茂盛,是该开心还是难过呢.. * ############ * / 总结下近期面试龙腾简合-java开发岗的经历.附上笔试 ...
- Redis(十)集群:Redis Cluster
一.数据分布 1.数据分布理论 2.Redis数据分区 Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot=CRC16(key)&16 ...
- FastReport快速实现条形码,二维码面单打印
一.什么是FastReport? FastReport是功能齐全的报表控件,使开发者可以快速并高效地为·NET/VCL/COM/ActiveX应用程序添加报表支持. FastReport有很多产品,如 ...
- Chrome插件开发(三)
在日常工作中,我们可能经常需要在手机端测试我们所做的页面,如果每次在手机端测试都手输网址,网址短的还好,如果长的网址也需要一个字母一个字母去敲,那无疑是一场噩梦,试想我们有一个工具只需要点击一个按钮就 ...
- H5与CSS3常用设置
1.设置div铺满全屏 对于一个div1,要使其属性height:100%生效,需要使其所有父元素,有确定的属性height.要铺满全屏,就是从html开始,所有的height为100%. 2.垂直居 ...
- 解决MacOs 下的 matplotlib 中文字体乱码
在使用 matplotlib 时候,如果表中有中文字体,那么可能会出现无法显示的情况,原因是因为缺少中文字体,可以使用以下步骤解决. 查看 matplotlib 的位置 matplotlib.matp ...
- numpy.array 合并和分割
# 导包 import numpy as np numpy.array 的合并 .concatenate() 一维数组 x = np.array([1, 2, 3]) # array([1, 2, 3 ...
- EffectiveJava-4
一.基本类型优先于装箱基本类型 Java的基本数据类型也叫做内置类型是java语言本身提供的数据类型,是引用其他类型的基础.Java的基本数据类型分为:整数类型.浮点类型.字符类型.布尔类型这四个类型 ...