P3275 [SCOI2011]糖果 题解
一道差分约束的模板题。
题意:n个人每个人至少一个糖果,另外要满足k个不等式,求最少糖果数。
差分约束系统
给定一组不等式 $ x[i]-x[j]<=c[k] $ (或 $ x[i]-x[j]>=c[k] $ ),需要求出满足所有不等式的一组解 $ (x[1],x[2],…,x[n]) $ 。这类问题是线性规划的一类简单问题。
形式:通常表示为 $ AX<=C(或AX>=C) $ ,其中系数矩阵 $ A $ 的每一行里有一个 $ 1 $ 和一个 $ -1 $ ,其余元素都为 $ 0 $。若 $ A $ 为 $ m* n $的矩阵,则 $ X $ 为 $ n* 1 $ 的矩阵,$ C $ 为 $ m* 1 $ 的矩阵,对应有 $ m $ 个不等式,$ n $ 个未知数,即该系统为一个有 $ n $ 个未知数、$ m $ 个约束条件的系统,这就是差分约束系统。

求解差分约束系统,可以转化成图论的单源最短路径问题
$ x[j]-x[i]<=b[k] $ ,类似最短路中的三角不等式 $ d[j] <= d[i] + w[i,j] $ ,即 $ d[j] - d[i] <= w[i,j] $
以每个变量 $ x[i] $ 为结点,对于约束条件 $ x[j]-x[i]<=b[k] $ ,连接一条边 $ E(i,j) $ ,边权为 $ b[k] $
增加一个源点S与所有其他点相连,边权均为 $ 0 $ , $ x[i]-x[0]<=0 $
则引例中的不等式可以转化为如下有向图:
x1-x2<=0
x1-x5<=-1
x2-x5<=1
x3-x1<=5
x4-x1<=-1
x4-x3<=-1
x5-x3<=-3
x5-x4<=-3

最短路和最长路的区分
若求最大的解,那么初始时把 $ d[] $ 设为无穷大,用最短路求解。即 $ if(d[v]>d[u]+w(u,v)) $ 进行更新,而建图的时候也要用小于等于。
若求最小的解,那么初始时把 $ d[] $ 设为无穷小,用最长路求解。即 if $ (d[v]<d[u]+w(u,v)) $ 进行更新,而建图的时候也要用大于等于。
以求解最大的为例(最小解同理)$ d[s] $ 一开始为无穷大,图最短路更新的条件为: $ if(d[v]>d[u]+w(u,v))d[v]=d[u]+w(u,v) $ ; 通过不断的松弛,使得d的值不断变小,直到满足所有条件,也就是说满足条件的时候就是最大的了。
那么这题我们可以分情况讨论
1.当 $ x=1 $ 建边 $ w[i,j]=0 \ w[j,i]=0 $
2.当 $ x=2 $ 建边 $ w[i,j]=1( $ 如果 $ i=j $ 输出 $ -1 $
3.当 $ x=3 $ 建边 $ w[j,i]=0 $ 可以取等就取等
4.当 $ x=4 $ 建边 $ w[j,i]=1( $ 如果 $ i=j $ 输出 $ -1 $
5.当 $ x=5 $ 建边 $ w[i,j]=0 $ 可以取等就取等
最后从 $ 0 $ 号节点向各个节点连一条长度为 $ 1 $ 的边(至少一个糖果,跑spfa最长路即可。
对于环特判,spfa一个点进入队列的次数大于等于n次,则说明存在环
最后统计每个点的糖果数即可
注意
$ ans $ 开 $ long \ long $ 十年 $ OI $ 一场空,不开$ long \ long $见祖宗
从 $ 0 $ 号节点建图倒过来枚举(出题人卡 $ spfa $ 丧心病狂, $ spfa $ 的效率与建图有关所以反过来就起飞
代码
#include<bits/stdc++.h>
using namespace std;
const int size=200010;
int tot,head[size],ver[size*2],Next[2*size],edge[2*size];
int v[size],d[size],to[size],n,k;
bool flag=1;
long long ans;
queue<int>q;
void add(int x,int y,int z){
ver[++tot]=y;edge[tot]=z;Next[tot]=head[x];head[x]=tot;
}
void spfa(){
memset(d,0,sizeof(d));
memset(v,0,sizeof(v));
v[0]=1;d[0]=0;
q.push(0);
while(q.size()){
int x=q.front();
q.pop();v[x]=0;
if(to[x]==n-1){
printf("-1");
exit(0);
}to[x]++;
for(int i=head[x];i;i=Next[i]){
int y=ver[i],z=edge[i];
if(d[y]<d[x]+z){
d[y]=d[x]+z;
if(!v[y]) q.push(y),v[y]=1;
}
}
}
}
int main(){
scanf("%d %d",&n,&k);
while(k--){
int x,a,b;
scanf("%d %d %d",&x,&a,&b);
if(x==1){
add(a,b,0);add(b,a,0);
}else if(x==2){
if(a==b) flag=0;
add(a,b,1);
}else if(x==3){
add(b,a,0);
}else if(x==4){
if(a==b) flag=0;
add(b,a,1);
}else{
add(a,b,0);
}
if(!flag){
printf("-1");
return 0;
}
}
for(int i=n;i;--i) add(0,i,1);
spfa();
for(int i=1;i<=n;++i) ans+=d[i];
printf("%lld",ans);
return 0;
}
P3275 [SCOI2011]糖果 题解的更多相关文章
- 洛谷P3275 [SCOI2011]糖果 题解
题目链接: https://www.luogu.org/problemnew/show/P3275 分析: 本题就是一个裸的差分约束. 核心: x=1x=1x=1时,a=b,a−>b,b−> ...
- [luogu P3275] [SCOI2011]糖果
[luogu P3275] [SCOI2011]糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些 ...
- P3275 [SCOI2011]糖果 && 差分约束(二)
学习完了差分约束是否有解, 现在我们学习求解最大解和最小解 首先我们回想一下是否有解的求解过程, 不难发现最后跑出来任意两点的最短路关系即为这两元素的最短路关系. 即: 最后的最短路蕴含了所有元素之间 ...
- 洛谷——P3275 [SCOI2011]糖果
P3275 [SCOI2011]糖果 差分约束模板题,基本思路就是$d[v]+w[v,u]<=d[u]$,$Spfa$更新方法, 有点套路的是要建立原点,即图中不存在的点来向每个点加边,但同样这 ...
- 差分约束详解&&洛谷SCOI2011糖果题解
差分约束系统: 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统(system of difference const ...
- 题解——洛谷P3275 [SCOI2011]糖果
一道条件非常多的差分约束 把\( a < b \)转化为\( a-b \le -1\)就可做了 \( a>b \)的情况同理 若有负环则无解输出-1 注意本题中要求每个人都有糖果 所以假设 ...
- 【luogu P3275 [SCOI2011]糖果】 题解
题目链接:https://www.luogu.org/problemnew/show/P3275 把不等式 A > B 转化成 A - B >= 1或者 B - A <= -1再差分 ...
- 洛谷P3275 [SCOI2011]糖果 [差分约束系统]
题目传送门 糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比 ...
- 【POJ 3159】Candies&&洛谷P3275 [SCOI2011]糖果
来补一下自己很久以前那个很蒟蒻很蒟蒻的自己没有学懂的知识 差分约束,说白了就是利用我们在求最短路的一个\(relax\)操作时的判断的原理 \[dis[v]>dis[u]+disj(u,v)\] ...
随机推荐
- LeetCode 802. Find Eventual Safe States
原题链接在这里:https://leetcode.com/problems/find-eventual-safe-states/ 题目: In a directed graph, we start a ...
- Kali Linux 2019.4中文乱码解决
1.先换源deb http://mirrors.aliyun.com/kali kali-rolling main non-free contribdeb-src http://mirrors.ali ...
- 用Xpath选择器解析网页(lxml)
在<爬虫基础以及一个简单的实例>一文中,我们使用了正则表达式来解析爬取的网页.但是正则表达式有些繁琐,使用起来不是那么方便.这次我们试一下用Xpath选择器来解析网页. 首先,什么是XPa ...
- delphi开第二个进程报错cannot create file editorlineends.ttr
网上说问题是windows系统补丁造成的,解决办法有卸补丁.装插件,还有自己搞个bat启动. 在网上看到最好的一个办法是: 把这个文件EditorLineEnds.ttr的后缀改为ttf,然后安装这个 ...
- Eclipse各个版本及其对应代号、下载地址列表【转】
Eclipse各个版本及其对应代号.下载地址列表 Eclipse各个版本及其对应代号.下载地址列表版本号 代码 日期 下载地址Eclipse 3.1 IO[木卫一,伊奥] 2005 http://ar ...
- redis状态详解
redis查看状态信息 info all|default Info 指定项 server服务器信息 redis_version : Redis 服务器版本 redis_git_sha1 : Git S ...
- koa art-template模板引擎的使用
art-template 模板引擎介绍 art-template 是一个简约.超快的模板引擎. 它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限的运行 性能,并且同 ...
- node.js使用cluster实现多进程
首先郑重声明: nodeJS 是一门单线程!异步!非阻塞语言! nodeJS 是一门单线程!异步!非阻塞语言! nodeJS 是一门单线程!异步!非阻塞语言! 重要的事情说3遍. 因为nodeJS天生 ...
- spring boot后端使用fastjson,错误代码415, 500
$.post({ url: "/register", dataType: "json", contentType: "application/json ...
- AOP通知类型
AOP通知类型 前置通知 在目标方法执行之前进行操作 后置通知 在目标方法执行之后 进行操作 环绕通知 在目标方法执行之前 和之后进行操作 public Object arount() 异常抛出通知 ...