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

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

分析:很明显的差分约束系统。

由于是求最小值,所以就要把所有不等式都转换成x-y>=k的形式然后连一条y->x权值为k的边。

后四个操作都很简单,关键是第一个操作。

那么我们就可以把A=B转换成A-B>=0且B-A>=0然后跑最长路最后统计就好啦。

还有就是判断负权(最短路)或正权(最长路)回路的问题,若一个点被松弛了n次以上则为有回路。

有一个很神奇的地方就是加起点到所有点的边的时候要倒着加不然就会T(我也不造为毛)

代码:

const

  maxn=100005;
  maxm=100005;

var
  state,d,last,time:array[0..maxn] of longint;
  v:array[0..maxn] of boolean;
  side:array[1..maxm*3] of record
    x,y,z,next:longint;
  end;
  n,m,e:longint;

procedure add(x,y,z:longint);
begin
  inc(e);
  side[e].x:=x; side[e].y:=y; side[e].z:=z;
  side[e].next:=last[x]; last[x]:=e;
end;

procedure init;
var
  x,y,z,i:longint;
begin
  readln(n,m);
  for i:=1 to m do
  begin
    readln(z,x,y);
    case z of
      1:begin add(x,y,0); add(y,x,0); end;
      2:add(x,y,1);
      3:add(y,x,0);
      4:add(y,x,1);
      5:add(x,y,0);
    end;
  end;
  for i:=n downto 1 do
    add(0,i,1);
end;

procedure spfa;
var
  head,tail,i,u:longint;
  ans:int64;
begin
  for i:=1 to e do
    with side[i] do
      if (x=y)and(z>0) then
      begin
        writeln(-1);
        exit;
      end;
  head:=0;
  tail:=1;
  state[1]:=0;
  time[0]:=1;
  fillchar(v,sizeof(v),true);
  v[0]:=false;
  repeat
    inc(head);
    if head>n+1 then head:=1;
    u:=state[head];
    i:=last[u];
    while i>0 do
      with side[i] do
      begin
        if d[x]+z>d[y] then
        begin
          inc(time[y]);
          if time[y]>n then
          begin
            writeln(-1);
            exit;
          end;
          d[y]:=d[x]+z;
          if v[y] then
          begin
            v[y]:=false;
            inc(tail);
            if tail>n+1 then tail:=1;
            state[tail]:=y;
          end;
        end;
        i:=next;
      end;
    v[u]:=true;
  until head=tail;
  ans:=0;
  for i:=1 to n do
    ans:=ans+d[i];
  writeln(ans);
end;

begin
  init;
  spfa;
end.
时间: 2024-08-06 08:41:18

bzoj 2330: [SCOI2011]糖果 差分约束系统的相关文章

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]糖果( 差分约束 )

坑爹...要求最小值要转成最长路来做.... 小于关系要转化一下 , A < B -> A <= B - 1 -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<iostream&

BZOJ 2330 [SCOI2011]糖果 差分约束spfa版

题意:自行百度,(之前做过一道candy的升级版). 方法:差分约束 解析:最近在学差分约束什么的,这道是做的第一个bz上的题,感觉还是较简单的.以下我对5种操作进行描述. case 转换不等式 转换不等式2 1 A>=0+B B>=0+A 2 B>=1+A 3 A>=0+B 4 A>=1+B 5 B>=0+A 如上表按照差分约束的原理加边,然后再观察上表不等式方向->为求大边,即最长路. 这些边是不够的,所有人应最少为1糖果,即创出个源点到各点距离为1. 后记:

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

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

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

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

bzoj 2330: [SCOI2011]糖果

1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,m,cnt,head[100006],next[400006],u[400006],v[400006],h,t,a[100006]; 5 int ci[100006],f[100006]; 6 long long d[100006]; 7 void jia(int a1,int a2,int a3) 8 { 9 cnt++; 10 next[

2330: [SCOI2011]糖果

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

BZOJ 2330 SCOI 2011 糖果 差分约束系统

题目大意:幼儿园老师给小盆友们发糖果.有5种要求,问老师最少需要准备多少糖果.如不能满足,输出-1. 思路:裸地差分约束系统,但是正向加边会T,需要反向加边. CODE: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 400010 using namespace std; int

P3275 [SCOI2011]糖果 &amp;&amp; 差分约束(二)

学习完了差分约束是否有解, 现在我们学习求解最大解和最小解 首先我们回想一下是否有解的求解过程, 不难发现最后跑出来任意两点的最短路关系即为这两元素的最短路关系. 即: 最后的最短路蕴含了所有元素之间的约束关系 好的了解了这点, 我们可以想到, 既然我们知道了元素之间的约束关系, 确定了一个元素的值, 不就确定了全部元素的极值了吗? 求解时, 经常地把源点的值设为 一个特定的值 ,让源点变为基础点, 来拓展其他的点的值.这就是差分约束系统元素极值的大致求解思路了 还有一点需要注意, (哪里写的都