差分约束系统:

如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。

    ——度娘。

然而并没有看懂。。

通俗来说,满足差分约束的条件是题目中给了你多个ai-aj<=(>=,<,>之类)的条件,要求同时满足这些条件并求极值的问题。

内么,怎么同时满足这些问题呢?

假如我们以这个东西为例:

a2<a1,a2<a3,a3<a1。并要求同时满足求满足条件的a的和的最小值。(a>=0)

那么,我们可以用图来描述这个问题:

我们设有向边(u,v),边权为1表示u>v。因为u>v等价于u-1>=v,也就是u-v>=1,那么我们就将(u,v),权值i理解为u-v=i。

画出来图长这样:

要满足所有条件且最小,也就是满足a1-a2=1,a1-a3+(a3-a2)=2。

整理得:a1-a2=1;a1-a2=2;

取最大的那个。

在图上表示,就(莫名其妙的)变成了求最长路!

很神奇吧qwq。

也就是说,如果你想满足所有条件,就先建图,然后根据题目情况(最短路求得未知数最大,最长路求得未知数最小)来跑最长/短路。

例题:SCOI2011糖果:

跑最长路qwq:

code:

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<cstdlib>
using namespace std; int n,k,x,a,b,sum=,head[],cnt[],dis[];
long long ans=;
queue<int> q;
bool vis[]; inline int read()
{
int ans=;
char ch=getchar(),last=' ';
while(ch>''||ch<'')last=ch,ch=getchar();
while(ch>=''&&ch<='')ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return last=='-'?-ans:ans;
} struct edge{
int next,to,dis;
}edg[]; inline void add(int from,int to,int dis)
{
edg[++sum].dis=dis;
edg[sum].to=to;
edg[sum].next=head[from];
head[from]=sum;
} int main(){
n=read();k=read();
for(int i=;i<=k;i++)
{
x=read(),a=read(),b=read();
if(x==){
add(a,b,);add(b,a,);
}
if(x==){
if(a==b){
printf("-1");return ;
}
add(a,b,);
}
if(x==){
add(b,a,);
}
if(x==){
if(a==b){cout<<-;return ;}
add(b,a,);
}
if(x==){
add(a,b,);
}
}
for(int i=;i<=n;i++)add(,i,);
vis[]=;q.push();
while(!q.empty()){
int now=q.front();q.pop();vis[now]=;
if(cnt[now]==n-){
printf("-1");return ;
}
cnt[now]++;
for(int i=head[now];i;i=edg[i].next)
{
int v=edg[i].to;
if(dis[v]<dis[now]+edg[i].dis){
dis[v]=dis[now]+edg[i].dis;
if(!vis[v])vis[v]=;q.push(v);
}
}
}
for(int i=;i<=n;i++)
{
ans+=dis[i];
}
printf("%lld\n",ans);
}

完结qwq

差分约束详解&&洛谷SCOI2011糖果题解的更多相关文章

  1. [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]

    题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...

  2. [poj 3159]Candies[差分约束详解][朴素的考虑法]

    题意 编号为 1..N 的人, 每人有一个数; 需要满足 dj - di <= c 求1号的数与N号的数的最大差值.(略坑: 1 一定要比 N 大的...difference...不是" ...

  3. 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会

    平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...

  4. 1_03_MSSQL课程_约束详解

    复习: ->创建数据库的SQL:******** create database 数据库名 on ( name=‘’, size=5MB, filegrowth=2MB, filename=&q ...

  5. 洛谷NOIp热身赛题解

    洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...

  6. 洛谷P2827 蚯蚓 题解

    洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...

  7. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  8. 洛谷P3275 [SCOI2011]糖果 题解

    题目链接: https://www.luogu.org/problemnew/show/P3275 分析: 本题就是一个裸的差分约束. 核心: x=1x=1x=1时,a=b,a−>b,b−> ...

  9. 转自 void- man 差分约束系统详解

    一直不知道差分约束是什么类型题目,最近在写最短路问题就顺带看了下,原来就是给出一些形如x-y<=b不等式的约束,问你是否满足有解的问题 好神奇的是这类问题竟然可以转换成图论里的最短路径问题,下面 ...

随机推荐

  1. realpython教程之机器学习之Windows下的环境配置

    不得不说,realPython的教程确实写的仔细,准确,有逻辑.果然高质量的学习材料还是更利于学的. 反观我们学校,似乎就有些急功近利了.连Python语言基础都没学,就直接讲深度学习.完全不符合学习 ...

  2. element-ui--按需引入

    参考链接:https://www.cnblogs.com/qiezuimh/p/10103522.html

  3. python常见队列queue分类

    import queue # 1.普通q# 2.先进后出q# 3.优先级q 普通Queue q=queue.Queue(3)q.put(1)q.put(2)q.put(3)print(q.get()) ...

  4. web - code/flash

    trace 来源: 1. http://traces.cs.umass.edu/index.php/Storage/Storage 源代码: 1.sourceforge 2.github.github ...

  5. Excel小技巧(生成数字篇)

    1. 自动生成1-1000: =ROW() 2.随机生成 1-100 : =RANDBETWEEN(1,100) // 若要包含小数点n位,就把(MIN,MAX)改成 (MIN*10^n,MAX*10 ...

  6. uboot传递参数'console=ttyXXX'的作用

    转载于:http://blog.csdn.net/jgdu1981/article/details/8643057 linux启动时uboot传递进console=ttyS0,115200n8的参数 ...

  7. Java更新Oracle的clob类型字段

    Java更新Oracle的clob类型字段 1.查询该clob字段 2.处理该clob字段查询结果 3.更新该clob字段查询结果 1.查询该clob字段 <select id="se ...

  8. 创建Sqoop作业,报错Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject

    WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P in ...

  9. _variant_t 与其他数据类型的转换

    在COM中使用的标准类Class如下所示: _bstr_t:对BSTR类型进行打包,并提供有用的操作方法: _com_error:定义抛出的error对象; _com_ptr_t:封装COM接口指针 ...

  10. H. The Nth Item(The 2019 Asia Nanchang First Round Online Programming Contest)

    题意:https://nanti.jisuanke.com/t/41355 给出N1,计算公式:A=F(N)Ni=Ni-1 ^ (A*A),F为类斐波那契需要矩阵快速幂的递推式. 求第k个N. 思路: ...