<更新提示>

<第一次更新>


<正文>

差分约束系统

我们先来认识一下差分约束系统鸭!

差分约束系统是一种特殊的\(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\}\)

先从代数角度思考,我们可以通过若干个不等式的相加得到如下的不等式组:

\[\begin{cases}
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\)最多相差的糖果数。

对于每一个要求,我们将其视为差分约束系统中的一个不等式即可。

\[b-a\leq c
\]

(节点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 差分约束系统』的更多相关文章

  1. Candies(差分约束系统)

    http://poj.org/problem?id=3159 思路:用O(V+ElogV)的Dijkstra算法求1到n的最短路.即用优先队列优化Dijkstra算法. #include <st ...

  2. POJ 3159 Candies (图论,差分约束系统,最短路)

    POJ 3159 Candies (图论,差分约束系统,最短路) Description During the kindergarten days, flymouse was the monitor ...

  3. 【POJ3159】Candies(差分约束系统)

    题意:有一些人, 给n个人派糖果,给出m组约束,每组约束包含A,B,c 三个数, 意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c . 最后求n 比 1 最多多多少糖果 ...

  4. UVA11478 Halum [差分约束系统]

    https://vjudge.net/problem/UVA-11478 给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的 ...

  5. BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status ...

  6. js实现『加载更多』功能实例

    DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...

  7. ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)

    当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用Bellmanford-SPFA解题 ZOJ2770-Burn the Linked Camp //差分约束方 ...

  8. 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来

    代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...

  9. POJ1201 Intervals(差分约束系统)

    与ZOJ2770一个建模方式,前缀和当作点. 对于每个区间[a,b]有这么个条件,Sa-Sb-1>=c,然后我就那样连边WA了好几次. 后来偷看数据才想到这题还有两个隐藏的约束条件. 这题前缀和 ...

随机推荐

  1. ZOJ 2588 Burning Bridges 割边(处理重边)

    <题目链接> 题目大意: 给定一个无向图,让你尽可能的删边,但是删边之后,仍然需要保证图的连通性,输出那些不能被删除的边. 解题分析: 就是无向图求桥的题目,主要是提高一下处理重边的姿势. ...

  2. 分分钟解决MySQL查询速度慢与性能差

    阅读本文大概需要 6 分钟. 一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够 ...

  3. LNMP环境并发优化

    LNMP环境并发优化 服务器 8核32Gx3 如图是一条http请求的生命周期,共经过nginx,php-fpm,PHP三个模块 所以我们可以从nginx,php-fpm,PHP三个维度去优化 一.p ...

  4. Shell脚本学习 - 基本内容以及数据格式

    为了捞取日志,自己用python写了一些东西,大致套路就是读取写入文件的操作,放到linux上跑.实际使用时发现要操作的文件有时比较大,直接打开文件找需要的东西可能会有一些效率问题.所以学习一下she ...

  5. STM8L052低功耗模式

    Stm8L系列单片机的低功耗有五种模式: § wait模式 § Lowpower run模式 § Lowpower wait模式 § Active-haltwith full RTC模式 § Halt ...

  6. Open-Domain QA -paper

    Open-domain QA Overview The whole system is consisted with Document Retriever and Document Reader. T ...

  7. 2018-2019-2 网络对抗技术 20162329 Exp2 后门原理与实践

    目录 1.实践基础 1.1.什么是后门 1.2.基础问题 2.实践内容 2.1.使用netcat获取主机操作Shell,cron启动 2.2.使用socat获取主机操作Shell, 任务计划启动 2. ...

  8. RSP小组——团队冲刺博客一——(领航)

    RSP小组--团队冲刺博客一--领航 冲刺日期:2018年12月10日 团队目标 经过团队讨论,我们最新确定的α版本所需实现内容如下: 1.实现游戏代码的实现 2.在Android Studio上实现 ...

  9. SpringMVC之拦截器的的配置和使用

    拦截器与过滤器的区别:拦截器只能拦截controller的请求,过滤器可以过滤所有请求 (1)实现HandlerInterceptor接口 在执行控制器中的方法之前执行preHandle()中的方法 ...

  10. EXCLE 导入 或 导出

    首先要引用 NPOI.dll   (可在网上下载!)//导入public void OnSubmit()        {            string path = Server.MapPat ...