洛谷P3275 [SCOI2011]糖果(差分约束)
题目描述
幼儿园里有 $N$ 个小朋友,$lxhgww $老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,$lxhgww$ 需要满足小朋友们的 $K$ 个要求。幼儿园的糖果总是有限的,$lxhgww$ 想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。
输入输出格式
输入格式:
输入的第一行是两个整数 $N$,$K$。接下来 $K$ 行,表示这些点需要满足的关系,每行 $3$ 个数字,$X$,$A$,$B$。
- 如果 $X=1$, 表示第 A个小朋友分到的糖果必须和第 B 个小朋友分到的糖果一样多;
- 如果 $X=2$, 表示第 A个小朋友分到的糖果必须少于第 B 个小朋友分到的糖果;
- 如果 $X=3$, 表示第 A个小朋友分到的糖果必须不少于第 B 个小朋友分到的糖果;
- 如果 $X=4$, 表示第 A个小朋友分到的糖果必须多于第 B 个小朋友分到的糖果;
- 如果 $X=5$, 表示第 A个小朋友分到的糖果必须不多于第 B 个小朋友分到的糖果;
输出格式:
输出一行,表示 $lxhgww$ 老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出 $−1$。
输入输出样例
思路:
主要考察差分约束,可以通过这篇博文http://www.cnblogs.com/void/archive/2011/08/26/2153928.html了解其基本原理和一些大体的变形
- 首先就是要根据题目中的不等关系建立有向图。怎么建图?每次将不等关系转化为大于且等于的关系,由后者向前者发出有向边建图。以x=1为例,这时候A和B两个小朋友分配的糖果一样多,那么有A-B=0,B-A=0,这时候分别从A出发,向B建立一条长度为0的边,再从B出发,向A建立一条长度为0的边,表示两者的关系;再如x=2,A的糖果小于B,那么A-B<0,那么有A-B<=-1,那么有B-A>=1,这时候从A出发向B建立一条长度为1的边;其余条件同理。
- 题目要求:老师至少需要准备的糖果数。即老师给每个学生发的糖要满足题目中的各个约束条件,转化为有向图就是要求有向图的最长路(因为只有最长路都满足了,其余条件才能保证一定满足)。不妨想像一下什么时候题目无解?对,就是图中出现正权环!为了判断正权环,采用SPFA,统计每个节点入队的次数,大于总结点数-1则说明图中有正权环。
- 同时注意:因为每个人得到的糖果数必须为正,新增加一个节点0,从0向每个人出发引入一条长度为1的边,再通过SPFA统计图中的最长路。
- 特判:X=2和X=4时,如果A,B两个人的糖果数相同直接输出-1结束。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define mp make_pair
#define int long long
using namespace std;
vector<pair<int,int> >ed[100010];
queue<int> Q;
int n,k;
int vis[100010],dis[100010];
int inq[100010];
int cnt[100010];
int spfa(int v){
Q.push(v);
inq[v]=1; while(!Q.empty()){
int u=Q.front();
Q.pop();
inq[u]=0;
cnt[u]++;
if(cnt[u]>n){//一共有n+1个节点(包括补充的节点0),SPFA每个节点在队列出现的次数不能超过总结点数-1(这里是n)
return 0;
}
for(int i=0;i<ed[u].size();i++){
int nxt=ed[u][i].first,d=ed[u][i].second;
if(dis[nxt]<dis[u]+d){
dis[nxt]=dis[u]+d;
if(!inq[nxt]){
inq[nxt]=1;
Q.push(nxt);
}
}
}
}
return 1;
}
signed main(){
scanf("%lld %lld",&n,&k);
for(int i=0;i<k;i++){
int x,a,b;
scanf("%lld %lld %lld",&x,&a,&b);
if(x==1){ed[a].push_back(mp(b,0));ed[b].push_back(mp(a,0));}
else if(x==2){ed[a].push_back(mp(b,1));if(a==b){printf("-1\n");return 0;}} //1.特判
else if(x==3){ed[b].push_back(mp(a,0));}
else if(x==4){ed[b].push_back(mp(a,1));if(a==b){printf("-1\n");return 0;}}//1.特判
else {ed[a].push_back(mp(b,0));}
}
for(int i=1;i<=n;i++) ed[0].push_back(mp(i,1)); if(!spfa(0)){
printf("-1\n");
return 0;
} int ans=0;
for(int i=1;i<=n;i++) ans+=dis[i];
printf("%lld\n",ans); return 0;
}
洛谷P3275 [SCOI2011]糖果(差分约束)的更多相关文章
- 洛谷P3275 [SCOI2011]糖果 [差分约束系统]
题目传送门 糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比 ...
- 洛谷——P3275 [SCOI2011]糖果
P3275 [SCOI2011]糖果 差分约束模板题,基本思路就是$d[v]+w[v,u]<=d[u]$,$Spfa$更新方法, 有点套路的是要建立原点,即图中不存在的点来向每个点加边,但同样这 ...
- P3275 [SCOI2011]糖果 && 差分约束(二)
学习完了差分约束是否有解, 现在我们学习求解最大解和最小解 首先我们回想一下是否有解的求解过程, 不难发现最后跑出来任意两点的最短路关系即为这两元素的最短路关系. 即: 最后的最短路蕴含了所有元素之间 ...
- 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)
洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...
- 【POJ 3159】Candies&&洛谷P3275 [SCOI2011]糖果
来补一下自己很久以前那个很蒟蒻很蒟蒻的自己没有学懂的知识 差分约束,说白了就是利用我们在求最短路的一个\(relax\)操作时的判断的原理 \[dis[v]>dis[u]+disj(u,v)\] ...
- 题解——洛谷P3275 [SCOI2011]糖果
一道条件非常多的差分约束 把\( a < b \)转化为\( a-b \le -1\)就可做了 \( a>b \)的情况同理 若有负环则无解输出-1 注意本题中要求每个人都有糖果 所以假设 ...
- 洛谷P3275 [SCOI2011]糖果 题解
题目链接: https://www.luogu.org/problemnew/show/P3275 分析: 本题就是一个裸的差分约束. 核心: x=1x=1x=1时,a=b,a−>b,b−> ...
- 洛谷P3275 [SCOI2011]糖果
差分约束大坑题 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...
- 洛谷 P3275 [SCOI2011]糖果
题目链接 题解 差分约束 学过的应该都会做 不会的自行百度,这里不多讲 opt=1 连一条长度为0的双向边 opt=2 (u->v) \(len=-1\) opt=3 (v->u) \(l ...
随机推荐
- oracle DG查看延时时间
oracle DG查看延时时间 SQL> select value from v$dataguard_stats where name='apply lag'; 例如: SQL> sele ...
- Unity状态机(Animator)
状态机的状态(State) 每个Animator Controller都会自带三个状态:Any State, Entry和 Exit.
- Shell脚本命令常用技巧
如果一个命令只有一次输出,但想持续观察输出变化,使用watch -d -n1 'df -h'可行,df -h输出一次硬盘使用情况,用上面指令可以持续观察.-d表示相邻输出如果有差异要高亮标记,-n1表 ...
- [日常摸鱼]Uva11178Morley's Theorem-几何
题意:给一个$\Delta ABC$,分别做三个角的三等分线相交成$\Delta DEF$,求出$D,E,F$的坐标. 直接根据题意模拟 #include<cstdio> #include ...
- 使用php进行微信小程序图片安全验证
想用到微信公众平台的图片识别系统,结果报错{"errcode":41005,"errmsg":"media data missing hint: [x ...
- SQL:我为什么慢你心里没数吗?
SQL 语句执行慢的原因是面试中经常会被问到的,对于服务端开发来说也是必须要关注的问题. 在生产环境中,SQL 执行慢是很严重的事件.那么如何定位慢 SQL.慢的原因及如何防患于未然.接下来带着这些问 ...
- java基础模拟考试三套试卷
卷1: 一.单选题(15道,共30分) //1.下列关于JDK.JRE.JVM关系描述正确的是 (A) A:JDK是开发工具,包含了JRE.JRE是运行环境,包含了JVM.JVM是虚拟机,可以保证跨平 ...
- 小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework
小马哥出手的Spring栈核心编程思想课程,可以说是非常专业和权威的Spring课程.课程主要的方向与核心是Spring Framework总览,带领同学们重新认识重新认识IoC,Spring IoC ...
- vue结合element-ui table本地分页
<template> <el-table :data="tableData1.slice((start1-1)*length1,start1*length1)" ...
- jdbc编程学习之增删改查(2)
一,enum类型的使用 在SQL中没有布尔类型的数据,我们都使用过布尔类型,当属性的值只用两种情况时.例如性别等.那在数据库对这些属性的值个数比较少时我们应该使用什么数据类型呢?SQL给我们提供了枚举 ...