BZOJ2330【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。
很显然的一个差分约束模型。
X=1时让num[i]==num[j],只需要转换成num[i]-num[j]>=0和num[j]-num[i]>=0两个式子即可,其他情况应该不用说了,裸的差分约束模板。
最后不要忘了把所有节点向0节点连一条长度为1的边。
-1有两种情况,一是图中出现环,二是X=2或4时a!=b,特判一下就行。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define maxn 100010
#define maxm 500010
using namespace std;
int head[maxn],dis[maxn],n,m,p,cnt,tot[maxn];
bool inq[maxn],flag=true;
struct edge
{int next;int to;int val;
}e[maxm];
void insert(int u,int v,int w)
{e[++cnt].next=head[u];head[u]=cnt;e[cnt].to=v;e[cnt].val=w;
}
queue<int> q;
void spfa(int s)
{memset(dis,-0x3f,sizeof(dis));memset(inq,false,sizeof(inq));dis[s]=0;inq[s]=true;q.push(s);while(!q.empty()){int now=q.front();q.pop();inq[now]=false;if(tot[now]==n-1){flag=false;break;} tot[now]++;for(int i=head[now];i;i=e[i].next){int v=e[i].to;if(dis[v]<dis[now]+e[i].val){dis[v]=dis[now]+e[i].val;if(!inq[v]){q.push(v);inq[v]=true;}}}}
}
int main()
{//freopen("candy4.in","r",stdin);int k;long long ans=0;cin>>n>>k;for(int i=1;i<=k;i++){int x,a,b;scanf("%d%d%d",&x,&a,&b);if(x==1){insert(a,b,0);insert(b,a,0);}if(x==2){if(a==b) flag=false;insert(a,b,1);} if(x==3) insert(b,a,0);if(x==4){if(a==b) flag=false;insert(b,a,1);} if(x==5) insert(a,b,0);}for(int i=n;i>=1;i--) insert(0,i,1);if(flag) spfa(0);for(int i=1;i<=n;i++) ans+=dis[i];//cout<<dis[i]<<endl;if(flag) cout<<ans;else cout<<"-1";return 0;
}
BZOJ2330【SCOI2011】糖果相关推荐
- BZOJ2330 SCOI2011糖果
复习了一波差分约束. http://blog.csdn.net/my_sunshine26/article/details/72849441 构图方式记住就好. 本题要倒序插入否则会被卡. 1 #in ...
- 差分约束 【bzoj2330】[SCOI2011]糖果
/*[bzoj2330][SCOI2011]糖果 2014年3月5日1,2761 Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖 ...
- bzoj 2330: [SCOI2011]糖果
2330: [SCOI2011]糖果 Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要 ...
- SPFA差分约束(bzoj 2330: [SCOI2011]糖果)
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6355 Solved: 2096 [Submit][Stat ...
- 【差分约束】SCOI2011糖果
P3275 [SCOI2011]糖果 快noip了我还在干什么啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 来我们看这道题 根据条件建图, 因为求得是最小值, 所以要跑最长路qwq(这是我记住的QAQ ...
- 【bzoj2330】 [SCOI2011]糖果
此题考察差分约束系统,用SPFA求最长路. 构图,边的权值只为0(等于 大于等于 小于等于)或1(大于 小于),dist数组存最长距离,即该小朋友的最少糖果数. 一次SPFA之后,直接输出dis数组总 ...
- 洛谷P3275 [SCOI2011]糖果
题目描述 幼儿园里有\(N\)个小朋友,\(lxhgww\)老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他 ...
- 【BZOJ 2330】 [SCOI2011]糖果【差分约束】
题目跳转: http://www.lydsy.com/JudgeOnline/problem.php?id=2330 Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友 ...
- P3275 [SCOI2011]糖果
emmmm博客补不完喽~~~(其实这是题目链接,但..也确实是事实..) 这题呢,也基本上就是差分约束的模板题了(要是不知道差分约束的话自行百度一下喽~~),实际上这类题目吧,撇开读入,基本都一样,就 ...
- 题解 P3275 【[SCOI2011]糖果】
清深夏令营机考压轴题,对差分约束的认识还是不够深刻,算法写出来了图没建对,/(ㄒoㄒ)/~~ #define inf 0x3f3f3f3f #define ll long long #define v ...
最新文章
- 如何使用python批量下载-使用 Python + Selenium 批量下载素材
- 手机PIN锁死让输入PUK解决方案
- 【视频】vue指令之v-for
- Spring 如何读取properties文件内容
- 北京大学数字视频编解码技术国家工程实验室开源AVS2高清实时编码器
- [数据结构]链表中销毁和清空的区别
- Collections 工具类常见方法
- 支撑4.5亿活跃用户的WhatsApp架构概览
- 史上最贵域名诞生!360斥资1700万美元买360.com
- java using的用法_using的几种用法 C#
- 有大招儿?请收下这份关于数据与智能的晋级攻略!
- DVWA系列之23 medium级别上传漏洞分析与利用
- JSP的自定义标签(一)
- poj 1511 Invitation Cards spfa比基础题难一些!!练练手挺好
- 高清成主流 十大最受用户关注摄像头
- 专业计算机怎么关机,Win10如何使用快捷键来关机?_win10专业版技巧
- 【C语言】从字符串中提取IP地址最简洁的方法
- StarUml----逆向工程操作步骤
- EXCEL 2016常用知识--Excel数据透视表
- 【微信小程序】微信小程序开发学习记录
热门文章
- windows服务器连接教程-手机连接电脑连接
- 前端vue经典面试题78道(重点详细简洁)
- vue插槽面试题_vue面试题总结
- 电商运营小白,如何快速入门学习数据分析?
- 黑苹果10.12.2驱动R9 270显卡成功一例
- 弘辽科技:直通车总集篇(下篇)
- c语言的0xF9为什么表示1,0xc0(0xc0为什么表示0)
- qtcpsocket断开_Qt QTcpSocket 对连接服务器中断的不同情况进行判定
- 微信小程序自定义弹窗,禁止page页面滚动。
- 串行通信:常见的串行通信接口协议UART、SPI、I2C简介