[SCOI2011]糖果 洛谷 3275 差分约束系统
2016-12-02 20:10
330 查看
题目描述
幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求。幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。输入格式
输入的第一行是两个整数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个小朋友分到的糖果;输出格式
输出一行,表示lxhgww老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出-1。分析
很水的差分约束系统,按照题目说的去连边就可以了但是有一点需要注意,就是每个人都要发糖,也就是说每个人都至少发一块糖,所以源点给每个点连边的时候连权值为1的边,不是权值为0的边。
另外有一个点存在a=b的情况 x=2和x=4的情况下如果a=b直接输出-1。
还有,要用long long (int64)
code
const maxe=600000; maxv=1500000; type arr=record x,y,w,next:longint; end; var n,m,s:longint; nm:longint; a:array[0..maxv] of arr; d:array[0..maxe] of int64; v1:array[0..maxe] of longint; ls:array[0..maxe] of longint; stick:array[0..maxv] of longint; head,tail:longint; x,y,w:longint; i,j,k:longint; flag:boolean; flaj:array[0..maxe] of longint; max:int64; procedure relax(u,v,w:longint); begin if d[u]+w<d[v] then begin d[v]:=d[u]+w; if v1[v]=0 then begin head:=head+1; stick[head]:=v; flaj[v]:=flaj[v]+1; v1[v]:=1; end; end; end; procedure spfa; var i,j:longint; begin head:=1; stick[head]:=0; v1[0]:=1; repeat j:=stick[head]; i:=ls[stick[head]]; head:=head-1; while i<>0 do with a[i] do begin relax(x,y,w); if flaj[y]>n then begin flag:=true; exit; end; i:=next; end; v1[j]:=0; until head=0; end; procedure add(x,y,w:longint); begin nm:=nm+1; a[nm].x:=x; a[nm].y:=y; a[nm].w:=w; a[nm].next:=ls[x]; ls[x]:=nm; end; procedure init; var i,j,k:longint; x,y,w:longint; begin readln(n,m); fillchar(a,sizeof(a),0); fillchar(d,sizeof(d),$7f); max:=d[1]; for j:=1 to m do begin read(w,x,y); if w=1 then begin add(x,y,0); add(y,x,0); end; if w=2 then begin if x=y then begin write(-1); halt; end; add(x,y,-1); end; if w=3 then add(y,x,0); if w=4 then begin if x=y then begin write(-1); halt; end; add(y,x,-1); end; if w=5 then add(x,y,0); end; for i:=1 to n do add(0,i,-1); m:=nm; d[0]:=0; flag:=false; end; begin init; spfa; if flag then writeln('-1') else begin max:=0; for i:=1 to n do max:=max+d[i]; writeln(-max); end; end.
相关文章推荐
- window7下karma 报 nodejs request TypeError: The header content contains invalid characters BUG
- linux下的DL库
- poj3294 Life Forms
- bzoj 2064 分裂 状压dp
- mycat分片join——sharejoin-改自官方权威指南
- 前端学数据库之子查询
- POJ 3734 Blocks 组合数学
- PAT(basic level) 1042 字符统计(20)
- A1056. Mice and Rice (25)
- 过滤器(Filter)应用之------设置页面缓存、用户的自动登录和敏感词过滤
- USACO 3.1 Agri-Net 最短网络 (最小生成树)
- 本段时间的总结和QuickHit项目
- linux应用程序helloword及makefile
- 教你关闭ubuntu防火墙以及停用服务
- java-20161202-基础易错题集合解析
- Python时间戳转变为时间格式
- 第7章 Spring Boot的Web开发
- 随笔记
- IDEA中创建maven管理的Spring项目
- 排序清单控制标记