『Candies 差分约束系统』
<更新提示>
<第一次更新>
<正文>
差分约束系统
我们先来认识一下差分约束系统鸭!
差分约束系统是一种特殊的\(n\)元一次不等式组,它包含了\(n\)个变量\(x_1-x_n\)以及\(m\)个不等式(约束条件)。其中每一个不等式形如\(x_i-x_j\leq c_k\),\(c_k\)是常数,\(i,j \leq n,k \leq m\)。
通常来说,题目会给出这一些限制条件的模型或变式,我们需要在满足这个不等式组的前提下求解一些指定的数值。
注意到不等式\(x_i-x_j\leq c_k\)我们可以将其转换为\(x_i\leq c_k+x_j\)。而最短路算法中的三角形不等式也是这个格式\(dis_j \leq dis_i+w\)(对于\(dis_j > dis_i+w\)我们需要更新最短路,故该式一定能得到满足),所以我们通常可以将差分约束系统的问题转化为最短路问题。一般地,我们将变量\(x_i,x_j\)看作图中的两个节点,而恰有一条长度为\(c_k\)的边从\(x_j\)连向\(x_i\)。这时候,边的含义是一个不等式。
更具体地来说,有一个很常见的问题。
对于给定的差分约束系统P,求\(\max\{x_n-x_1\}\)
先从代数角度思考,我们可以通过若干个不等式的相加得到如下的不等式组:
x_n-x_1\leq d_1
\\x_n-x_1\leq d_2
\\...
\\x_n-x_1\leq d_n
\end{cases}
\]
那么显然\(\min\{d_1,d_2,...,d_n\}\)就是答案。
从图论角度思考:先根据差分约束系统建图。
我们可以通过若干条边从不同的路径有节点1走到n。其中各个路径的权值和分别为\(d_1,d_2,...,d_n\),那么\(\min\{d_1,d_2,...,d_n\}\)是什么呢?
- 没错,最短路。
我们将一个差分约束系统的问题转换为了最短路问题。
接下来,我们通过一道入门例题来了解。
Candies(POJ3159)
Description
During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought the kids of flymouse’s class a large bag of candies and had flymouse distribute them. All the kids loved candies very much and often compared the numbers of candies they got with others. A kid A could had the idea that though it might be the case that another kid B was better than him in some aspect and therefore had a reason for deserving more candies than he did, he should never get a certain number of candies fewer than B did no matter how many candies he actually got, otherwise he would feel dissatisfied and go to the head-teacher to complain about flymouse’s biased distribution.
snoopy shared class with flymouse at that time. flymouse always compared the number of his candies with that of snoopy’s. He wanted to make the difference between the numbers as large as possible while keeping every kid satisfied. Now he had just got another bag of candies from the head-teacher, what was the largest difference he could make out of it?
Input Format
The input contains a single test cases. The test cases starts with a line with two integers N and M not exceeding 30 000 and 150 000 respectively. N is the number of kids in the class and the kids were numbered 1 through N. snoopy and flymouse were always numbered 1 and N. Then follow M lines each holding three integers A, B and c in order, meaning that kid A believed that kid B should never get over c candies more than he did.
Output Format
Output one line with only the largest difference desired. The difference is guaranteed to be finite.
Sample Input
2 2
1 2 5
2 1 4
Sample Output
5
解析
就是以上提到的差分约束系统。
题目大意:有\(n\)个孩子,\(m\)个要求,每一个要求形如:孩子\(a\)认为孩子\(b\)不能比他多超过\(c\)个糖果。求孩子\(1\)和孩子\(n\)最多相差的糖果数。
对于每一个要求,我们将其视为差分约束系统中的一个不等式即可。
\]
(节点a向节点b连一条权值为c的边)
建图后栈式\(SPFA\)(卡堆优化\(Dijkstra\)和队列\(SPFA\))跑最短路解决。
\(Code:\)
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
const int N=30000+80,M=150000+80;
struct edge{int ver,val,next;}e[M*4];
int n,m,Last[M],t,dis[N],vis[N];
inline void insert(int x,int y,int v)
{
e[++t].val=v;e[t].ver=y;
e[t].next=Last[x];Last[x]=t;
}
inline void input(void)
{
t=0;
memset(Last,0,sizeof Last);
for(int i=1;i<=m;i++)
{
int x,y,v;
scanf("%d%d%d",&x,&y,&v);
insert(x,y,v);
}
}
inline void spfa(void)
{
memset(dis,0x7f,sizeof dis);
memset(vis,0x00,sizeof vis);
dis[1]=0;vis[1]=1;
stack< int > Stack;
Stack.push(1);
while(!Stack.empty())
{
int temp=Stack.top();
Stack.pop();
vis[temp]=0;
for(int i=Last[temp];i;i=e[i].next)
{
if(dis[e[i].ver]>dis[temp]+e[i].val)
{
dis[e[i].ver]=dis[temp]+e[i].val;
if(!vis[e[i].ver])
{
Stack.push(e[i].ver);
vis[e[i].ver]=true;
}
}
}
}
}
int main(void)
{
while(scanf("%d%d",&n,&m)==2)
{
input();
spfa();
printf("%d\n",dis[n]);
}
return 0;
}
<后记>
『Candies 差分约束系统』的更多相关文章
- Candies(差分约束系统)
http://poj.org/problem?id=3159 思路:用O(V+ElogV)的Dijkstra算法求1到n的最短路.即用优先队列优化Dijkstra算法. #include <st ...
- POJ 3159 Candies (图论,差分约束系统,最短路)
POJ 3159 Candies (图论,差分约束系统,最短路) Description During the kindergarten days, flymouse was the monitor ...
- 【POJ3159】Candies(差分约束系统)
题意:有一些人, 给n个人派糖果,给出m组约束,每组约束包含A,B,c 三个数, 意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c . 最后求n 比 1 最多多多少糖果 ...
- UVA11478 Halum [差分约束系统]
https://vjudge.net/problem/UVA-11478 给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的 ...
- BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5395 Solved: 1750[Submit][Status ...
- js实现『加载更多』功能实例
DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...
- ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)
当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用Bellmanford-SPFA解题 ZOJ2770-Burn the Linked Camp //差分约束方 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- POJ1201 Intervals(差分约束系统)
与ZOJ2770一个建模方式,前缀和当作点. 对于每个区间[a,b]有这么个条件,Sa-Sb-1>=c,然后我就那样连边WA了好几次. 后来偷看数据才想到这题还有两个隐藏的约束条件. 这题前缀和 ...
随机推荐
- gzip解压文件报错
#tar -xvf jdk-8u131-linux-x64.tar.gz,执行命令后报错如下: gzip: stdin: not in gzip format tar: Child returned ...
- Windows远程桌面相关
3389端口是Windows系统远程终端服务以及系统远程桌面服务默认所使用的端口,原本是为了管理人员能够方便的远程维护管理计算机而设计的,但如今已经成为了黑客们最喜爱的一种人侵途径,入侵者通过3389 ...
- Vray
VRay是由chaosgroup和asgvis公司出品,中国由曼恒公司负责推广的一款高质量渲染软件.
- Android应用程序如何使用Internet资源?
思路:连接Internet资源-->分析XML资源-->使用Download Manager下载文件 Android的Internet连接模型和用于分析Internet数据源的Java技术 ...
- [微信跳转链接]之WAP跳转微信内指定页面
由于微信覆盖太全面了,几乎所有人都使用微信APP,但是对于做产品的公司来说,所有的产品几乎都离不开微信的推广,然而微信属于封闭式的一个社交应用,大部分只能在今日头条,百度,等等...如果你在推广页面上 ...
- 制作docker-jdk7-zookeeper镜像(非集群版)
## 准备工作 用到的工具, Xshell5, Xftp5, jdk-7u79-linux-x64.tar.gz, zookeeper-3.4.9.tar.gz, docker.io/centos:l ...
- centos7搭建本地 Remix
由于最近要弄加入某联盟链,是基于ETH 所以要弄一个开发环境 一.准备 安装 nodejs,npm,git 二.安装 git clone https://github.com/ethereum/rem ...
- Android 应用内悬浮控件实践总结
在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图: 首先想到的是申请悬浮窗权限,OK~ 打开搜索引擎,映入眼帘的并不是如何申请,而是“Android 悬浮窗权限各机型各系统适配大 ...
- 自然语言处理(四)统计机器翻译SMT
1.统计机器翻译三要素 1.翻译模型 2.语言模型 3.排序模型 2.翻译流程 1.双语数据预处理 2.词对齐 3.构造短语翻译表 4.对短语翻译表进行概率估计 5.解码,beam search 6. ...
- React组件和生命周期简介
React 简介----React 是 Facebook 出品的一套颠覆式的前端开发类库.为什么说它是颠覆式的呢? 内存维护虚拟 DOM 对于传统的 DOM 维护,我们的步骤可能是:1.初始化 ...