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 HINT
数据范围】
对于30%的数据,保证 N<=100
对于100%的数据,保证 N<=100000
对于所有的数据,保证 K<=100000,1<=X<=5,1<=A, B<=N

算法讨论:

差分约束裸题。

但是有几个注意的地方:

差分约束可以构建最短路模型,也可以构建最长路模型。

如果有x1 >= 常数。如此的形式,就提醒我们要加超级源点啦。

统计答案的方式。

为了提高SPFA的效率,可以在开始的时候把所有的点都入队。

代码:

#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm> using namespace std;
const int N = 100000 + 5;
const int inf = 1000000000; int n, k, cnt;
int dis[N], head[N], que[N * 10], inque[N];
bool vis[N];
struct Edge {
int from, to, dis, next;
}edges[N << 2]; void insert(int from, int to, int d) {
++ cnt;
edges[cnt].from = from; edges[cnt].to = to; edges[cnt].dis = d;
edges[cnt].next = head[from]; head[from] = cnt;
} void init() {
int x, A, B;
scanf("%d%d", &n, &k);
for(int i = 1; i <= k; ++ i) {
scanf("%d%d%d", &x, &A, &B);
switch(x) {
case 1: { insert(A, B, 0); insert(B, A, 0); break; }
case 2: { if(A == B) puts("-1"), exit(0); insert(A, B, 1); break; }
case 3: { insert(B, A, 0); break; }
case 4: { if(A == B) puts("-1"), exit(0); insert(B, A, 1); break; }
case 5: { insert(A, B, 0); break; }
}
}
for(int i = 1; i <= n; ++ i) insert(n + 1, i, 1);
} bool spfa() {
int h = 1, t = 1;
vis[n + 1] = true; inque[n + 1] = 1;
que[h] = n + 1; dis[que[h]] = 0;
for(int i = 1; i <= n; ++ i) {
vis[i] = true;
que[++ t] = i;
inque[i] = 1;
dis[i] = -inf;
}
while(h <= t) {
int x = que[h];
vis[x] = false;
for(int i = head[x]; i; i = edges[i].next) {
int v = edges[i].to;
if(dis[v] < dis[x] + edges[i].dis) {
dis[v] = dis[x] + edges[i].dis;
if(!vis[v]) {
que[++ t] = v;
inque[v] ++;
if(inque[v] > n + 1) return false;
vis[v] = true;
}
}
}
++ h;
}
return true;
} void work() {
if(!spfa()) { puts("-1"); return; }
else {
long long ans = 0;
for(int i = 1; i <= n; ++ i)
ans = (long long) ans + dis[i];
printf("%lld\n", ans);
}
} int main() {
init();
work();
return 0;
}

BZOJ 2330 SCOI 2011 糖果的更多相关文章

  1. CDOJ 435 (SCOI 2011) 糖果 Label:差分约束系统

    糖果 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 131072/131072KB (Java/Others) Submit Stat ...

  2. [SCOI 2011]糖果

    Description 题库链接 给出 \(N\) 个节点,节点有正点权, \(K\) 个三元组 \((X,A,B)\) 来描述节点点权之间的关系. 如果 \(X=1\) , 表示 \(A\) 的点权 ...

  3. 解题:SCOI 2011 糖果

    题面 能把差分约束卡死的题,因为正解并不是差分约束,然而被我用一种奇怪的姿势过去了... 差分约束就是相等互相连零边,不超过/不低于从不多的一方向另一方连零边,超过/低于从少的一方向另一方连最小的边权 ...

  4. [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)

    [BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...

  5. [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)

    [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...

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

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

  7. BZOJ 2330 糖果

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

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

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

  9. BZOJ 2330: [SCOI2011]糖果( 差分约束 )

    坑爹...要求最小值要转成最长路来做.... 小于关系要转化一下 , A < B -> A <= B - 1 ------------------------------------ ...

随机推荐

  1. Sicily 2005.Lovely Number

    题目地址:2005.Lovely Number 思路: 若测试数据出现的次数为奇数,则输出它. 所以,可以先排序,若前后相等,前后都设为0,最后不为0的则可以输出. 具体代码如下: #include ...

  2. poj1127 Jack Straws(线段相交+并查集)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Jack Straws Time Limit: 1000MS   Memory L ...

  3. GridView Footer页脚统计实现多行

    在使用GridView时有时会需要多行显示页脚Footer的统计,下面是一种解决方法,仅仅供各位参考 在GridView的RowCreated事件中添加多行页脚,实例代码如下: protected v ...

  4. smarty练习:数据的增删改

    根据数据库中的三张表格:timu,xuanxiang,kemu来进行数据的增删改查,并且使用smarty模版将前端与后台分离开来 三张表格: 主页面后台 main.php: <?php //引入 ...

  5. PS 色彩的色相谱

    7- 色彩的色相谱 在这个环中,位于180度夹角的两种颜色(也就是圆的某条直径两端的颜色),称为反转色,又称为互补色.互补的两种颜色之间是此消彼长的关系,小框往蓝色移动的同时就会远离黄色, 黄色=白色 ...

  6. 使用PHP解压文件Unzip

    这是一个非常方便的PHP函数从.zip文件解压缩文件.它有两个参数:第一个是压缩文件的路径和第二 function unzip_file($file, $destination) { // creat ...

  7. Python番外 事务 那些事

    Transaction 也就是所谓的事务了,通俗理解就是一件事情.从小,父母就教育我们,做事情要有始有终,不能半途而废. 事务也是这样,不能做一般就不做了,要么做完,要么就不做.也就是说,事务必须是一 ...

  8. QT中读取文本数据(txt)

    下面的代码实现读取txt文档中的数据,并且是一行一行的读取. void MainWindow::on_pushButton_clicked() { QFile file("abcd.txt& ...

  9. Altium Designer 覆铜时过孔连接形式的设置——只将过孔连接设置为Direct Connect

    Altium Designer 在PCB覆铜时,所有的过孔和焊盘都是十字连接即Relief Connect连接的,没有像PROTEL 99SE一样只有接地的焊盘才是十字连接而过孔是直接连接的. 如下图 ...

  10. Linq to object 技巧、用法集锦

    一.一个字符串,一个字符串数组.判断字符串数组里的元素出现在字符串中的有几个. class Program { static void Main(string[] args) { string str ...