洛谷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 ...
随机推荐
- redis 存储验证码 基本使用
1 redis 存储验证码 基本使用 1.1 setting 配置 CACHES = { "default": { "BACKEND": "djang ...
- JUC(二):CAS及ABA
CAS是什么? 比较并交换. CAS示例 package com.chinda.java.audition; import java.util.concurrent.atomic.AtomicInte ...
- 移动端 FileReader文件上传
一.file上传文件 <input type="file" multiple> multiple 设置多选 通过change事件监听是否上传文件 files 属性获 ...
- [OI笔记]后缀自动机
本来没打算写的,不过想想看后缀自动机的理论看了两三天了才有点懂(我太傻了)-下周期末考的话大概要去复习一下文化课感觉回来又要忘得差不多,还是开篇blog记一下好了. 相关的资料: cls当年的课件:2 ...
- 学Python编程能做什么工作?从事什么岗位?——这些问题你知道吗?
前言 学Python编程能做什么工作?随着人工智能发展,学习python语言的人员有更多的岗位机会,python从事的职业广泛,从游戏到AI人工智能能都可以用Python实现.除了编程,各种岗位的人都 ...
- 微信小程序手机号解密失败-43001
今天是2020年1月16号,从昨天下午开始,一直遇到一个问题: 客户在注册会员的时候的第二步,验证手机号的时候,一直提示验证失败,-43001 直接说原因:用户的session_key过期 期间大部分 ...
- angular8
@Component 装饰器告诉Angular , AppComponent 类是一个组件,装饰器的属性用于配置该组件的应用方式. selectot 属性告诉Angular如何在HTML文档中应用该组 ...
- Python爬虫:爬取喜马拉雅音频数据详解
前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...
- String 和 StringBuffer,StringBuilder 的区别
String 和 StringBuffer,StringBuilder 的区别 String 是 " 字符串常量" , 对象一旦创建就不可改变,这就导致如果字符串常量池中没有所需对 ...
- 后端Long类型传到前端精度丢失的正确解决方式
原因:前端js对Long类型支持的精度不够,导致后端使用的Long传到前端丢失精度,比如现在分布式id生成算法"雪花算法"在使用中就会出现问题. 解决方式: 1.后端的Long类型 ...