2330: [SCOI2011]糖果

Time Limit: 10 Sec Memory Limit: 128 MB

Description

幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求。幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。

Input

输入的第一行是两个整数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个小朋友分到的糖果;

Output

输出一行,表示lxhgww老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出-1。

Sample Input

5 7

1 1 2

2 3 2

4 4 1

3 4 5

5 4 5

2 3 5

4 5 1

Sample Output

11

题目讨论

这是一道很明显的差分约束,不知道的自行百度,hzwer有SPFA解法

不过我不想写SPFA,花了一个小时写tarjan+toposort。

我们将边分为\(\le\)和\(\lt\),用\(\le\)跑tarjan,之后跑toposort。

交上去结果WA了。后来发现需要先判一发强联通内部是否存在环。

#include <cstdio>
#include <cstring>
inline int geti() {
register int a; register char c;
while(c=getchar(),c<'-');a=c-'0';
while(c=getchar(),'-'<c)a=(a<<3)+(a<<1)+c-'0';
return a;
}
#define N 100003
#define ll long long
struct E{int to;E*nxt;}CD[N<<1],*cd=CD,*h1[N],*h2[N];
#define adde1(a,b) (cd->to=b,cd->nxt=h1[a],h1[a]=cd++)
#define adde2(a,b) (cd->to=b,cd->nxt=h2[a],h2[a]=cd++)
inline void cmin(int&a,int b){b<a?a=b:1;}
inline void cmax(int&a,int b){a<b?a=b:1;}
int bel[N],bsiz[N],bc,dfs_clock,dfn[N],deg[N],sta[N],tp,d[N];
int tarjan(int u) {
int low=dfn[u]=++dfs_clock,v;
sta[++tp]=u;
for(E*it=h1[u];it;it=it->nxt)
if(!dfn[v=it->to]) cmin(low,tarjan(v));
else if(!bel[v]) cmin(low,dfn[v]);
if(low==dfn[u]) {
++bc;
do {
v=sta[tp--];
bel[v]=bc;
++bsiz[bc];
}while(v^u);
}
return low;
}
struct e{int to,v;e*nxt;}CE[N<<1],*ce=CE,*head[N];
inline void build_new_graph(int n) {
for(int i=1,v;i<=n;++i) {
for(E*it=h1[i];it;it=it->nxt)
if((v=bel[it->to])^bel[i]) {
ce->to=v;ce->v=0;
ce->nxt=head[bel[i]];
head[bel[i]]=ce++;
++deg[v];
}
for(E*it=h2[i];it;it=it->nxt)
if((v=bel[it->to])^bel[i]) {
ce->to=v;ce->v=1;
ce->nxt=head[bel[i]];
head[bel[i]]=ce++;
++deg[v];
}
}
}
inline bool judge(int n) {
int cn=n,u,v; tp=0;
for(int i=1;i<=n;++i)
if(!deg[i]) sta[++tp]=i;
while(tp) {
u=sta[tp--]; --cn;
for(E*it=h2[u];it;it=it->nxt)
if(!(--deg[it->to])) sta[++tp]=it->to;
}
if(cn) return false;
else return true;
}
inline ll toposort() {
int u,v,x=bc;
tp=0;
for(int i=1;i<=bc;++i)
if(!deg[i]) sta[++tp]=i,d[i]=1;
else d[i]=0;
while(tp) {
u=sta[tp--]; --x;
for(e*it=head[u];it;it=it->nxt) {
v=it->to;
cmax(d[v],d[u]+it->v);
if(!(--deg[v])) sta[++tp]=v;
}
}
if(x>0) return -1LL;
long long ret=0;
for(int i=1;i<=bc;++i)
ret+=(ll)bsiz[i]*d[i];
return ret;
}
int main() {
register int n=geti(),k=geti(),i,a,b;
while(k--) {
i=geti(),a=geti(),b=geti();
if(i==1) adde1(a,b),adde1(b,a);
else if(i==2) adde2(a,b),++deg[b];
else if(i==3) adde1(b,a);
else if(i==4) adde2(b,a),++deg[a];
else adde1(a,b);
}
for(i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
if(!judge(n)) return puts("-1"),0;
build_new_graph(n);
printf("%lld\n",toposort());
return 0;
}

bzoj2330: [SCOI2011]糖果的更多相关文章

  1. BZOJ2330 SCOI2011 糖果 【差分约束】

    BZOJ2330 SCOI2011 糖果 Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一 ...

  2. bzoj2330: [SCOI2011]糖果 差分约束系统

    幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候 ...

  3. BZOJ2330:[SCOI2011]糖果(差分约束)

    Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...

  4. BZOJ2330 SCOI2011糖果

    复习了一波差分约束. http://blog.csdn.net/my_sunshine26/article/details/72849441 构图方式记住就好. 本题要倒序插入否则会被卡. #incl ...

  5. bzoj2330: [SCOI2011]糖果(差分约束)

    差分约束裸题,a==b的话分别建a>=b a<=b的边就行.倒序加边不然会TLE是什么鬼 #include<iostream> #include<cstring> ...

  6. [BZOJ2330][SCOI2011]糖果 差分约束系统+最短路

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2330 类似于题目中这种含有不等式关系,我们可以建立差分约束系统来跑最长路或最短路. 对于一 ...

  7. 【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA

    [bzoj2330]: [SCOI2011]糖果 恩..就是裸的差分约束.. x=1 -> (A,B,0) (B,A,0) x=2 -> (A,B,1)  [这个情况加个A==B无解的要特 ...

  8. 差分约束 【bzoj2330】[SCOI2011]糖果

    /*[bzoj2330][SCOI2011]糖果 2014年3月5日1,2761 Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖 ...

  9. BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status ...

随机推荐

  1. Microsoft Dynamics CRM 2013 Js Odata 查询

    实现功能:   在新建记录时,(大区,省区,城市)的值默认为当前用户的值.tips:字段均为lookup类型; function Default_region(){ var fromtype=Xrm. ...

  2. Atitit mac os 版本 新特性 attilax大总结

    Atitit mac os 版本 新特性 attilax大总结 1. Macos概述1 2. 早期2 2.1. Macintosh OS (系统 1.0)  1984年2 2.2. Mac OS 7. ...

  3. android AsynTask处理返回数据和AsynTask使用get,post请求

    Android是一个单线程模型,Android界面(UI)的绘制都只能在主线程中进行,如果在主线程中进行耗时的操作,就会影响UI的绘制和事件的响应.所以在android规定,不可在主线中进行耗时操作, ...

  4. iOS sqlite 的各种操作

    iOS --SQL的增加.删除.查找.修改 iOS对于数据库的操作:增加.删除.查找.修改 首先需要创建一个数据库:本程序的数据库是在火狐浏览器里的插件里写的微量型数据库 火狐找查找SQLite Ma ...

  5. Android入门(一)

    原文链接:http://www.orlion.ga/387/ 一.安卓的系统架构 1. linux内核层,这一层为安卓设备提供底层的驱动 系统运行库层,这一层通过一些C/C++库来为Android系统 ...

  6. 多站点配置apache服务器

    以阿里云服务器为例,使用的是阿里云web一键安装包 目录: /alidata/server/httpd-2.4.10/conf/extra 代码内容: <VirtualHost *:80> ...

  7. 使用Flask设计带认证token的RESTful API接口[翻译]

    上一篇文章, 使用python的Flask实现一个RESTful API服务器端  简单地演示了Flask实的现的api服务器,里面提到了因为无状态的原则,没有session cookies,如果访问 ...

  8. 路由集合中已存在名为“ XXXX” 的路由

    一般是认为路由的名字Key重复了,改下就行,但是还有种情况,你发现不是的,你把Key名称改了就好,不改就有问题.为什么?那就是有可能在bin目录下其它的DLL中有重复的Key了,这个时候,就要看看该改 ...

  9. 如何安装appium-linux

    准备工作: JDK/Android sdk (记得把android sdk的环境变量命名成ANDROID_HOME ) 确保ADB命令可用 git python 和 pip 一,安装node.js和n ...

  10. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...