【BZOJ2330】 [SCOI2011]糖果

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

HINT

【数据范围】

对于30%的数据,保证 N<=100

对于100%的数据,保证 N<=100000

对于所有的数据,保证 K<=100000,1<=X<=5,1<=A, B<=N

差分约束

按照我以前的写法,都是x-y<=z建一条由y到x长度为z的边,黄学长的代码告诉我y-x>=z可以建一条由x到y长度为z的边

另外把spfa的大于小于号改一下就可以跑最长路了。。。

 1 #include<cstdio>
 2 #include<vector>
 3 #include<cstring>
 4 using namespace std;
 5 const int N=1000005;
 6 int cs[N],head[4*N],dis[N],b[N];
 7 bool ss[N],flag;
 8 int n,k,sum,cnt;
 9 long long ans;
10 struct ee{int to,next,v;}e[N*4];
11 void add(int u,int v,int w){
12     e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].v=w;
13 }
14
15 void spfa(int s){
16     int h=0,t=1;
17     b[t]=s;dis[s]=0;cs[s]++;
18     while (h!=t){
19         int now=b[++h];if (h==N) h=0;
20         for (int l=head[now];l;l=e[l].next){
21             int v=e[l].to;
22             if (dis[now]+e[l].v>dis[v]){
23                 dis[v]=dis[now]+e[l].v;
24                 if (!ss[v]){
25                     b[++t]=v;
26                     if (t==N)t=0;
27                     ss[v]=1;
28                     cs[v]++;
29                     if (cs[v]>=n) {flag=1;return;}
30                 }
31             }
32         }
33         ss[now]=0;
34     }
35 }
36
37 int main(){
38     scanf("%d%d",&n,&k);
39     int u,opt,v;
40     for (int i=1;i<=k;i++){
41         scanf("%d%d%d",&opt,&u,&v);
42         switch(opt){
43             case 1:add(u,v,0);add(v,u,0);break;
44             case 2:if(u==v){printf("-1");return 0;}add(u,v,1);break;//这里必须有特判,否则会T,但我不知道为什么,可能是数据的问题
45             case 3:add(v,u,0);break;
46             case 4:if(u==v){printf("-1");return 0;}add(v,u,1);break;
47             case 5:add(u,v,0);break;
48         }
49     }
50     for (int i=n;i>0;i--)add(0,i,1);
51     spfa(0);
52     if (flag){
53         printf("-1");return 0;
54     }
55     for (int i=1;i<=n;i++) ans+=dis[i];
56     printf("%lld",ans);
57 } 
时间: 2025-01-17 15:31:15

【BZOJ2330】 [SCOI2011]糖果的相关文章

bzoj2330 [SCOI2011]糖果题解

http://www.lydsy.com/JudgeOnline/problem.php?id=2330 题目大意 对这个题我真的不想再多提一句了. n个人分糖,保证每个人都有糖,有k个限制条件,分别是a=b,a<b,a≥b,a>b,a≤b.这五种情况分别用x=1,2,3,4,5表示.求最少需要准备多少糖果.其中n,k≤106. 题解 一看就是差分约束了. 差分约束中求最小值用≥,跑最长路:求最大值用≤,跑最短路. x=1即a=b,直接a→b,b→a权值都是0: x=3即a≥b,直接b→a,权

BZOJ2330[SCOI2011]糖果

差分约束第二题 传送门: 这个的模型很清楚,具体的建模可以参考代码. 一个需要注意的点.如果题目中有d[i]==d[j]的地方,只需要连两个边权为0的双向边就行了. 1 //BZOJ 2330 2 //by Cydiater 3 //2016.9.1 4 #include <iostream> 5 #include <cstdio> 6 #include <cstring> 7 #include <string> 8 #include <algorit

bzoj2330: [SCOI2011]糖果 差分约束

这题有毒.首先显然是差分约束裸题,然而n,m<=1e5,并且有两个数据如下: 1.有负环的大数据.由于spfa判负环是o(nm)的,所以这个点要跑5s.然而这个点存在负的自环,可以直接判掉…… 2.1->2->...->n的一条链.若1先入队,则可以一次更新完.否则每次编号较小的点会把所有编号大于它的点都重新更新一次,就卡到了o(n^2).若一般的边表按1->n加边,入队顺序就是n->1.面向数据地,可以倒着加边,或者按1->n先把所有点入队. 有一个tarjan

[BZOJ2330]SCOI2011糖果|差分约束

差分约束题..学了一下差分约束,我觉得还是挺简单的,考虑f[u]-f[v]<=c,发现和最短路的松弛操作神似,最短路跑完之后对于一条边(v,u),显然有d[u]<=d[v]+c,不就是上面差分约束的式子吗..那就转化成最短(长)路做咯,以最短路为例了,对于每个f[u]-f[v]<=c,连一条v到u权值为c的边,然后跑最短路,如果有负环那就说明无解,没有的话跑完之后各点的d值就是解.. 对于本题,d[a]==d[b],有 d[a]-d[b]>=0, d[b]-d[a]>=0 d

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

[bzoj2330]: [SCOI2011]糖果 恩..就是裸的差分约束.. x=1 -> (A,B,0) (B,A,0) x=2 -> (A,B,1)  [这个情况加个A==B无解的要特判] x=3 -> (B,A,0)  [恩这个是不少于一开始zz建反了] x=4 -> (B,A,1) x=5 -> (A,B,0) 然后源点到所有点建1的边[恩据说有条链所以要反着连]跑最长路就好了 1 /* http://www.cnblogs.com/karl07/ */ 2 #inc

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

/*[bzoj2330][SCOI2011]糖果 2014年3月5日1,2761 Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求.幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求. Input 输入的第

P3275 [SCOI2011]糖果

P3275 [SCOI2011]糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求.幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求. 输入输出格式 输入格式: 输入的第一行是两个整数N,K.接下来K行,表示这些点

(bzoj2330)糖果

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

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

2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status][Discuss] Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求.幼儿园的糖果

bzoj 2330 [SCOI2011]糖果(差分约束系统)

2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3574  Solved: 1077[Submit][Status][Discuss] Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求.幼儿园的糖果