来补一下自己很久以前那个很蒟蒻很蒟蒻的自己没有学懂的知识


差分约束,说白了就是利用我们在求最短路的一个\(relax\)操作时的判断的原理

\[dis[v]>dis[u]+disj(u,v)
\]

然后题目中一般会给你一堆不等关系,我们就可以将他们转化成一个点一个点之间的约束关系

然后,这种东西就可以做啦

然后再来说一下这道题目

题目要求,对于给定的\(A,B,C\),使得

\[B-A<=C
\]

然后我们发现,这不就是一道裸题吗

于是就可以愉快的码代码了

然后,再提醒一句,由于本题数据过于毒瘤,再加上\(NOI2018\)归程一题的惨案现场,建议各位不要使用\(SPFA\),毕竟人家已经死了

贴代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct cc{
int to,w,nex;
}e[400010];
int head[200010],cnt;
int d[200010];
void add(int a,int b,int c)
{
++cnt;
e[cnt].to=b;
e[cnt].w=c;
e[cnt].nex=head[a];
head[a]=cnt;
}
struct node{
int u,d;
bool operator<(const node &a)const{
return a.d<d;
}
};
priority_queue<node> q;
void DJ(int s)
{
memset(d,0x3f,sizeof d);
d[s]=0;
q.push((node){s,0});
while(!q.empty())
{
node fir=q.top();
q.pop();
if(d[fir.u]!=fir.d) continue;
for(int i=head[fir.u];i;i=e[i].nex)
{
int v=e[i].to;
if(d[v]>d[fir.u]+e[i].w)
{
d[v]=d[fir.u]+e[i].w;
q.push((node){v,d[v]});
}
}
}
}
int main()
{
int n,m,a,b,c;
while(scanf("%d%d",&n,&m)==2)
{
memset(head,0,sizeof head);
cnt=0;
for(int i=1;i<=m;++i)
scanf("%d%d%d",&a,&b,&c),add(a,b,c);
DJ(1);
printf("%d\n",d[n]);
}
return 0;
}

然后又碰到本题的升级版

就是一共有五种不同的约束关系

所以要每一种每一种分开处理,将其化成我们松弛操作时的那个样子,然后就可以愉快的求解了

本题还有一个限制条件,每个孩子都必须要有糖果

这个很简单,就是建立一个超级源,与每个点的距离都为一就行了

但是,个人认为,本题你就只能硬着头皮使用\(SPFA\)了

还有,本题是有可能出现矛盾的情况的,所以需要在SPFA时判断负环

然后,就贴代码吧

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct cc{
int to,w,nex;
}e[400010];
int head[200010],cnt;
int d[200010];
void add(int a,int b,int c)
{
++cnt;
e[cnt].to=b;
e[cnt].w=c;
e[cnt].nex=head[a];
head[a]=cnt;
}
int n,m,a,b,c;
bool vis[200010];
int tot[200010];
queue<int> q;
void DJ(int s)
{
d[0]=0;
vis[0]=1;
q.push(s);
while(!q.empty())
{
int fir=q.front();
q.pop();
vis[fir]=0;
if(tot[fir]==n-1)
{
printf("-1\n");
exit(0);
}
++tot[fir];
for(int i=head[fir];~i;i=e[i].nex)
{
int v=e[i].to;
if(d[v]<d[fir]+e[i].w)
{
d[v]=d[fir]+e[i].w;
if(!vis[v])
q.push(v);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(head,-1,sizeof head);
cnt=0;
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&c,&a,&b);
if(c==1) add(a,b,0),add(b,a,0);
else if(c==2)
{
if(a==b)
{
printf("-1\n");
return 0;
}
else add(a,b,1);
}
else if(c==3) add(b,a,0);
else if(c==4)
{
if(a==b)
{
printf("-1\n");
return 0;
}
else add(b,a,1);
}
else add(a,b,0);
}
for(int i=n;i>=1;--i)
add(0,i,1);//超级源
DJ(0);
long long ans=0;
for(int i=1;i<=n;++i)
ans+=d[i];
printf("%lld",ans);
return 0;
}

【POJ 3159】Candies&&洛谷P3275 [SCOI2011]糖果的更多相关文章

  1. 洛谷——P3275 [SCOI2011]糖果

    P3275 [SCOI2011]糖果 差分约束模板题,基本思路就是$d[v]+w[v,u]<=d[u]$,$Spfa$更新方法, 有点套路的是要建立原点,即图中不存在的点来向每个点加边,但同样这 ...

  2. 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)

    洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...

  3. 洛谷P3275 [SCOI2011]糖果 [差分约束系统]

    题目传送门 糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比 ...

  4. 题解——洛谷P3275 [SCOI2011]糖果

    一道条件非常多的差分约束 把\( a < b \)转化为\( a-b \le -1\)就可做了 \( a>b \)的情况同理 若有负环则无解输出-1 注意本题中要求每个人都有糖果 所以假设 ...

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

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

  6. 洛谷P3275 [SCOI2011]糖果(差分约束)

    题目描述 幼儿园里有 $N$ 个小朋友,$lxhgww $老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...

  7. 洛谷P3275 [SCOI2011]糖果

    差分约束大坑题 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...

  8. 洛谷 P3275 [SCOI2011]糖果

    题目链接 题解 差分约束 学过的应该都会做 不会的自行百度,这里不多讲 opt=1 连一条长度为0的双向边 opt=2 (u->v) \(len=-1\) opt=3 (v->u) \(l ...

  9. 洛谷P3275 [SCOI2011]糖果_差分约束_判负环

    Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...

随机推荐

  1. LEDAPS1.3.0版本移植到windows平台----HuSr大气校正模块

    这个是2012年左右放在百度空间的,谁知百度空间关闭...转移到博客园. 最近项目用到3.1.2版本的LEDAPS,新版本的使用情况会在后续文章中慢慢丰富. HuSr是将LEDAPS项目中的TM/ET ...

  2. 美团技术沙龙01 - 58到家服务的订单调度&数据分析技术

    1. 2015.4.15 到家服务的订单调度&数据分析技术 58到家· 黄海斌 @xemoaya 2.agenda • 58到家介绍 • 订单管理系统介绍 • 数据分析技术的应用 3.2015 ...

  3. App跟web定位元素页面相互切换

    很多QA在做UI自动化或者App自动化的时候,会遇到在web页面要抓取App模式的元素,或者是在App要抓取H5页面的元素,从网上整理了一些方法,不一定能解决,但是试一下也未尝不可,如果解决了就记得关 ...

  4. sql server中嵌套事务*

    转自 https://www.cnblogs.com/guanjie20/archive/2013/02/17/2914488.html 我们在写事务时经常遇到的问题如下: 消息 266,级别 16, ...

  5. CSS优先级的及其衡量标准CSS权重

    一.背景 CSS有三大特性:层叠性.继承性.优先级. 而我们在给CSS定义样式的时候,经常出现两个及以上的规则应用在同一元素上,单该元素最终在浏览器呈现的效果是应用的哪个规则呢?这就要考虑优先级的问题 ...

  6. hadoop 分析

    Hadoop源代码分析(一) Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http://research.goo ...

  7. docker容器日志收集方案(方案三 filebeat+journald本地日志收集)

    其实方案三和方案二日志采集套路一样,但是还是有点差别. 差别就在于日志格式如下: ​ 为了方便对比吧日志贴上来 Nov 16 10:51:58 localhost 939fe968a91d[4721] ...

  8. web Deploy发布问题

    使用vs开发的时候,经常会发布项目.传统发布是登陆远程桌面.或ftp这些发布都有一定的麻烦.不能灵活的管理发布的文件.因此后来研究了web Deploy,研究之后发现是很不错的发布工具.这里把我使用w ...

  9. Kerberos原理

    前些日子为了搞清楚Kerberos原理,把MIT的Kerberos经典对话看了几遍,终于有了一个稍微清晰的认识,这里稍微记录下,因为Kerberos是使用传统加密技术实现的一个认证机制,所以顺便备忘下 ...

  10. JavaScript—面向对象开发详解和垃圾回收

    面向对象的概述 ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP). 面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是, ...