洛谷P3275 [SCOI2011]糖果 题解
题目链接:
https://www.luogu.org/problemnew/show/P3275
分析:
本题就是一个裸的差分约束。
核心:
x=1x=1x=1时,a=b,a−>b,b−>aa=b,a->b,b->aa=b,a−>b,b−>a,连边权值为000
x=2x=2x=2时,a<ba<ba<b,此时我们用整数这个性质,于是可知a≤b−1a\leq b-1a≤b−1,a−>ba->ba−>b,权值为111
x=3x=3x=3时,b≤ab\leq ab≤a,bbb向aaa连权值为000
x=4x=4x=4时,b<ab<ab<a,此时我们用整数这个性质,于是可知b≤a−1b\leq a-1b≤a−1,b−>ab->ab−>a,权值为111
x=5x=5x=5时,a≤ba\leq ba≤b,aaa向bbb连权值为000
然后就是因为每个人都有糖,所以000向iii连边,权值为1(1≤i<=n)1(1\leq i<=n)1(1≤i<=n)
这里很多的存储方式为了避免链的超时,需要倒序,但是这里的vector邻接表存储倒序反而超时!
提醒:
x=2x=2x=2或x=4x=4x=4时,可能出现A=BA=BA=B的情况,此时要特判输−1-1−1
数据较大,要开longlonglong longlonglong
代码:
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
struct edge
{
int to,val;
edge(int _to,int _val)
{
to=_to;
val=_val;
}
};
long long dis[300005];
int vis[300005],tot[300005];
vector<edge>e[300005];
void add(int x,int y,int w)
{
e[x].push_back(edge(y,w));
}
int main()
{
queue<int>q;
int n,k,X,A,B;
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&X,&A,&B);
if(X==1)
{
add(A,B,0);
add(B,A,0);
}
else
if(X==2)
{
if(A==B)
{
printf("-1\n");
return 0;
}
add(A,B,1);
}
else
if(X==3)
{
add(B,A,0);
}
else
if(X==4)
{
if(A==B)
{
printf("-1\n");
return 0;
}
add(B,A,1);
}
else
add(A,B,0);
}
for(int i=1;i<=n;i++)
{
add(0,i,1);
}
vis[0]=1;
q.push(0);
while(!q.empty())
{
int x=q.front();q.pop();
vis[x]=0;
for(int i=0;i<e[x].size();i++)
{
int y=e[x][i].to;
if(dis[y]<dis[x]+e[x][i].val)
{
dis[y]=dis[x]+e[x][i].val;
if(vis[y]==0)
{
vis[y]=1;
q.push(y);
tot[y]++;
if(tot[y]>n)
{
printf("-1\n");
return 0;
}
}
}
}
}
long long ans=0;
for(int i=1;i<=n;i++)
{
ans+=dis[i];
}
printf("%lld\n",ans);
return 0;
}
洛谷P3275 [SCOI2011]糖果 题解的更多相关文章
- 洛谷——P3275 [SCOI2011]糖果
P3275 [SCOI2011]糖果 差分约束模板题,基本思路就是$d[v]+w[v,u]<=d[u]$,$Spfa$更新方法, 有点套路的是要建立原点,即图中不存在的点来向每个点加边,但同样这 ...
- 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)
洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...
- 题解——洛谷P3275 [SCOI2011]糖果
一道条件非常多的差分约束 把\( a < b \)转化为\( a-b \le -1\)就可做了 \( a>b \)的情况同理 若有负环则无解输出-1 注意本题中要求每个人都有糖果 所以假设 ...
- 洛谷P3275 [SCOI2011]糖果 [差分约束系统]
题目传送门 糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比 ...
- 【POJ 3159】Candies&&洛谷P3275 [SCOI2011]糖果
来补一下自己很久以前那个很蒟蒻很蒟蒻的自己没有学懂的知识 差分约束,说白了就是利用我们在求最短路的一个\(relax\)操作时的判断的原理 \[dis[v]>dis[u]+disj(u,v)\] ...
- 洛谷 P3275 [SCOI2011]糖果
题目链接 题解 差分约束 学过的应该都会做 不会的自行百度,这里不多讲 opt=1 连一条长度为0的双向边 opt=2 (u->v) \(len=-1\) opt=3 (v->u) \(l ...
- 洛谷P3275 [SCOI2011]糖果(差分约束)
题目描述 幼儿园里有 $N$ 个小朋友,$lxhgww $老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...
- 洛谷P3275 [SCOI2011]糖果
差分约束大坑题 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...
- 洛谷P3275 [SCOI2011]糖果_差分约束_判负环
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...
随机推荐
- Android零基础入门第62节:搜索框组件SearchView
原文:Android零基础入门第62节:搜索框组件SearchView 一.SearchView概述 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当 ...
- Unity 3d新手上路
作为一位unity新手,初学遇到了不少坑,而且不知道怎么找,发觉网上关于unity的文档好少,还是我暂时没找到. 现在说说void OnTriggerEnter(Collider e),这个函数是我加 ...
- Qt编译和使用boost库(附QT5.51的Boost下载)good
配置gcc可以在cmd中使用 添加MinGW到环境变量 安装过Qt的都已经默认安装过MinGw的环境了,只需要找到配置一下环境变量就行 我的在D:\Qt5.5.1\Tools\mingw492_32\ ...
- C++字符串的操作(简单全面)
void *memccpy (void *dest, const void *src, int c, size_t n); 从src所指向的对象复制n个字符到dest所指向的对象中.如果复制过程中遇到 ...
- QImage的浅拷贝与深拷贝
首先简单说说什么是浅拷贝和深拷贝:浅拷贝就比如像引用类型,而深拷贝就比如值类型,即浅拷贝是共用一块内存的,而深拷贝是复制一份内容. 我们再来看看QImage类的几个构造函数: // 浅拷贝 QI ...
- c++实现游戏开发中常用的对象池(含源码)
c++实现游戏开发中常用的对象池(含源码) little_stupid_child2017-01-06上传 对象池的五要素: 1.对象集合 2.未使用对象索引集合 3.已使用对象索引集合 4.当前 ...
- java-mysql(3) 读写image
在mysql里面用来存储图片有一个特殊的数据对象叫做 Blob(Binary Large Object). 数据库里面插入一张图片: 第一步:需要为图片创建一个文件对象 File img = new ...
- java多线程之管道流
java语言中提供了各种各样的流供我们操纵数据,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据. 一个线程发送数据到输出管道,另一个线程从输入管道读取数据,通过使用管道 ...
- Tido 习题-二叉树-最高分
题目描述 老师想知道从某某同学到某某同学当中,分数最高的是多少.现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入 输入包含多组测试数据.每组输入第一行是两个正整数N和M(0& ...
- Vim入门操作整理
根据小甲鱼的vim入门视频整理,供查阅 移动指令:上下左右 k j h l 翻页: ctrl + b ctrl + f 保存退出:ZZ 普通模式:vim fileName 首次进入的就是普通模式 从 ...