洛谷 3275 [SCOI2011]糖果
N句话题意
有N个人,k个限制,有五种限制
如果X=1, 表示第A个小朋友的糖果必须和第B个小朋友的糖果一样多;
如果X=2, 表示第A个小朋友的糖果必须少于第B个小朋友的糖果;
如果X=3, 表示第A个小朋友的糖果必须不少于第B个小朋友的糖果;
如果X=4, 表示第A个小朋友的糖果必须多于第B个小朋友的糖果;
如果X=5, 表示第A个小朋友的糖果必须不多于第B个小朋友的糖果;
求满足所有要求需要最少的糖果数(每个人至少为1)
**Solution**
一个差分约束题目,然额本蒟蒻还不是很会。首先分析限制条件,很明显2和4,3和5是一样的限制,并且要求最少的糖果数。那么不少于(多于)我们就建0边,而要求少于(多于)我们就建权值为1的边,很明显这样所需要的糖果最少。建好图后我们只需要跑一遍最长路即可。
为什么是最长路呢?看看下面这张图,(也是盗的)。
图中dis[1]如果是最短路为1,但很显然1点至少需要两个糖果。(很显然,因为肯定得满足约束最多的条件的情况才是合法的!)。
注:后面0向1→n建边时一定要倒序。
Coding
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int head[N],n,m,cnt;
struct limit
{
int to,next;
long long w;
}e[N*5];
void add(int x,int y,long long w)
{
e[++cnt].to=y,e[cnt].next=head[x],e[cnt].w=w;
head[x]=cnt;
}
int dis[N],tot[N];
long long vis[N];
queue<int> q;
bool SPFA()
{
q.push(0);
dis[0]=0;
vis[0]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
tot[u]++;
if(tot[u]==n-1) {cout<<-1; return 0;}
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(dis[u]+e[i].w>dis[v])
{
dis[v]=dis[u]+e[i].w;
if(!vis[v]) q.push(v),vis[v]=1;
}
}
}
return 1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,opt;
scanf("%d%d%d",&opt,&x,&y);
if(opt==1) add(x,y,0),add(y,x,0);
if(opt==2)
{
if(x==y) {cout<<-1; return 0;}
add(x,y,1);
}
if(opt==3) add(y,x,0);
if(opt==4)
{
if(x==y) {cout<<-1; return 0;}
add(y,x,1);
}
if(opt==5) add(x,y,0);
}
for(int i=n;i;i--) add(0,i,1);
if(!SPFA()) return 0;
long long ans=0;
for(int i=1;i<=n;i++)
ans+=dis[i];
cout<<ans;
return 0;
}
洛谷 3275 [SCOI2011]糖果的更多相关文章
- BZOJ2330或洛谷3275 [SCOI2011]糖果
BZOJ原题链接 洛谷原题链接 很明显的差分约束,但数据范围较大,朴素\(SPFA\)判正环求解会\(T\)(理论上如此,但我看到有挺多人用朴素的还跑得挺快..),所以需要优化. 我们所建立的有向图中 ...
- 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)
洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...
- 洛谷——P3275 [SCOI2011]糖果
P3275 [SCOI2011]糖果 差分约束模板题,基本思路就是$d[v]+w[v,u]<=d[u]$,$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]糖果 [差分约束系统]
题目传送门 糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比 ...
- 洛谷P3275 [SCOI2011]糖果(差分约束)
题目描述 幼儿园里有 $N$ 个小朋友,$lxhgww $老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...
- 洛谷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 ...
随机推荐
- Apache/Nginx为PHP设置、添加$_SERVER服务器环境变量
在PHP开发中为了区分线上生产环境还是本地开发环境, 如果我们能通过判断$_SERVER['RUNTIME_ENVIROMENT']为 'DEV'还是'PRO'来区分该多好, 可惜的是$_SERVER ...
- Context都没弄明白,还怎么做Android开发?
Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...
- 关于js对象的基础使用方法-《javascript设计模式》读书笔记
一.利用对象收编变量 当我们决定实现某一项功能的时候最简单的其实就是写一个命名函数,然后调用来实现,就像这样: function checkName(){ //验证姓名 } function chec ...
- 【音乐App】—— Vue-music 项目学习笔记:歌手页面开发
前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 一.歌手页面布局与设计 需 ...
- breakpoints && lldb  && chisel 的使用
Breakpoints BreakPoint分类 breakpoint也是有分类的.我这里的文章内大致按使用的方式分为了 Normal Breakpoint,Exception Breakpoint, ...
- apue学习笔记(第六章 系统数据文件和信息)
UNIX系统的正常运作需要使用大量与系统有关的数据文件,例如,口令文件/etc/passwd和组文件/etc/group就是经常被多个程序频繁使用的两个文件. 口令文件 UNIX系统口令文件包含如下字 ...
- (十)jQuery对表单、表格的操作
一.表单应用 1.HTML中的表单大致由三部分组成 (1).表单标签:包含处理表单数据所用的服务端程序URL,以及数据提交到服务器的方法. (2).表单域:包含文本框.密码框.隐藏域.多行文本框.复选 ...
- 如何禁止同IP站点查询和同IP站点查询的原理分析 Robots.txt屏蔽BINGBOT
很多站长工具中都有“同IP站点查询”.“IP反查域名”这种服务不少人都不知道是什么原理,其实这些服务几乎都是用BING(以前的LIVE)来实现 的,BING有个特别功能 BING抓取页面时会把站点的I ...
- Linux远程无密码登陆并远程执行脚本
假设 A (192.168.20.59)为客户机器,B(192.168.20.60)为目标机: 要达到的目的: A机器ssh登录B机器无需输入密码: 加密方式选 rsa|dsa均可以,默认dsa ss ...
- Lua数据库访问
© 版权声明:本文为博主原创文章,转载请注明出处 1.代码 luasql = require "luasql.mysql" --创建环境对象 env = luasql.mysql( ...