洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)
差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路。。。。。。
看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了
为了保证复杂度,需要缩点后用拓扑排序统计答案。首先全相等的点本质上是相同的,可以缩到一起,所以先来一波Tarjan把0环全缩起来。接着再考虑边权为1的边。如果这时候还出现了环(包括缩点以后的自环),一定是不存在方案的,这是可以用拓扑排序判断。否则,就是个DAG,拓扑排序也可以直接计算出答案。
统计答案要注意:因为缩了点,所以答案要乘上超级点的size;因为每个小朋友都要有糖,所以最后答案+n(或者也可以将虚点的d值初始化为1,只不过最后要减掉1)
我不会说我连Tarjan都不会写调了半个下午的
#include<cstdio>
#include<algorithm>
using namespace std;
#define I inline
#define R register
#define G ch=getchar()
#define REP for(i=1;i<=n;++i)
#define add(L,X,Y)\
l[++p]=L;to[p]=Y;\
ne[p]=he[X];he[X]=p;\
if(!tl[X])tl[X]=p//鬼畜tl指向链表尾部,方便链表合并
const int N=100009,M=N*3;
int p,df,tot,he[N],tl[N],ne[M],to[M],rd[N],d[N],low[N],dfn[N],sz[N],f[N],st[N];
bool l[M];
template<typename T>
I void in(R T&z){
R char G;
while(ch<'-')G;
z=ch&15;G;
while(ch>'-')z*=10,z+=ch&15,G;
}
void tarjan(R int x){
low[st[++p]=x]=dfn[x]=++df;
for(R int y,i=he[x];i;i=ne[i]){
if(l[i])continue;//只能缩0环
if(!dfn[y=to[i]]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(!f[y])low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
++tot;
do ++sz[f[st[p]]=x];
while(st[p--]!=x);
}
}
int main(){
R int p=0,n,k,S,o,x,y,i,j,cnt=0;
in(n);in(k);S=n+1;
R long long ans=n;//好像
while(k--){
in(o);in(x);in(y);
switch(o){
case 1:add(0,x,y);add(0,y,x);break;
case 2:add(1,x,y);break;
case 3:add(0,y,x);break;
case 4:add(1,y,x);break;
case 5:add(0,x,y);
}
}
for(i=1;i<=n;++i){add(0,S,i);}//虚点搞上
tarjan(S);
for(i=1;i<=S;++i){
x=f[i];
for(j=he[i];j;j=ne[j]){
y=to[j]=f[to[j]];//改一下
if(x!=y)++rd[y];//在新图上统计入度
else if(l[j]){puts("-1");return 0;}//自环可以直接判掉
}
}
for(i=1;i<=S;++i)//合并链表
if(i!=f[i])ne[tl[i]]=he[f[i]],he[f[i]]=he[i];
st[p=1]=S;
while(p){
++cnt;//统计进入拓扑排序的总点数
ans+=d[x=st[p--]]*sz[x];
for(i=he[x];i;i=ne[i]){
y=to[i];
d[y]=max(d[y],d[x]+l[i]);
if(!--rd[y])st[++p]=y;
}
}
printf("%lld\n",cnt<tot?-1:ans);
return 0;
}
洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)的更多相关文章
- 洛谷P3275 [SCOI2011]糖果(差分约束)
题目描述 幼儿园里有 $N$ 个小朋友,$lxhgww $老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...
- 洛谷P3275 [SCOI2011]糖果 [差分约束系统]
题目传送门 糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比 ...
- 洛谷——P3275 [SCOI2011]糖果
P3275 [SCOI2011]糖果 差分约束模板题,基本思路就是$d[v]+w[v,u]<=d[u]$,$Spfa$更新方法, 有点套路的是要建立原点,即图中不存在的点来向每个点加边,但同样这 ...
- P3275 [SCOI2011]糖果 && 差分约束(二)
学习完了差分约束是否有解, 现在我们学习求解最大解和最小解 首先我们回想一下是否有解的求解过程, 不难发现最后跑出来任意两点的最短路关系即为这两元素的最短路关系. 即: 最后的最短路蕴含了所有元素之间 ...
- 【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 ...
随机推荐
- Android开发环境的发展以及重装系统之后在myeclipse重配Android开发环境。
android的开发环境早期要自己去去官网下SDK,ADT,AVD等.不仅在一开始要面临国内防火墙的阻拦,四处奔波之后都下载好了,还得自己Linked,可谓困难重重.随着android开发的火热,上面 ...
- 非const引用不能指向临时变量
没找到具体原因,MSDN看到下面这句,VC是从2008才有这一限制的,感觉就是从语法上对临时变量增加了限定,因为一般说来修改一个临时变量是毫无意义的,通过增加限定,强调临时变量只读语义.虽然实际上修改 ...
- C3P0配置实战
C3P0: 一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. 默认情况下(即没有配置连接池的 ...
- Scala_数据类型
Scala与Java有着相同的数据类型,Scala数据类型都是对象,Scala中没有类似Java中那样的原始类型. Scala 的基本数据类型有: Byte,Short,Int,Long 和 Char ...
- .net 设置Webbowser 版本
.net 里的Webbowser控件默认情况是用IE7来渲染 可修改注册表试用是最新的版本来渲染: using System; using System.Collections.Generic; us ...
- Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) #define _IOR(type,nr,size) _IOC(_IOC_RE ...
- HTML基础之JS
HTML中的三把利器的JS 又称为JavaScript,看着好像和Java有点联系,实际上他和java半毛钱关系都没有,JavaScript和我们学习的Python.Go.Java.C++等,都是一种 ...
- ReactJS实用技巧(2):从新人大坑——表单组件来看State
不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...
- 501. Find Mode in Binary Search Tree【LeetCode by java】
Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...
- 华为笔试——C++平安果dp算法
题目:平安果 题目介绍:给出一个m*n的格子,每个格子里有一定数量的平安果,现在要求从左上角顶点(1,1)出发,每次走一格并拿走那一格的所有平安果,且只能向下或向右前进,最终到达右下角顶点(m,n), ...