分糖果 5 0公升級版

2022-07-22 06:06:09 字數 2798 閱讀 6937

題目描述

幼兒園裡有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的邊

最後說個題外話 這個題原資料有乙個點是乙個十萬的鏈 有個玄學方法可以解決 就是源點連邊的時候倒著加邊(從n加到1)

另外有乙個點存在a=b的情況 x=2和x=4的情況下如果a=b直接輸出-1

**

type

arr=record

x,y,w,next:longint;

end;

var ans:int64;

n,k,nm:longint;

a:array [0..800001] of arr;

st,ls,len:array [0..400001] of longint;

d:array [0..400001] of int64;

v:array [0..400001] of boolean;

bo:boolean;

procedure

add(u,v,z:longint);

begin

inc(nm);

with a[nm] do

begin

x:=u; y:=v; w:=z;

next:=ls[u];

ls[u]:=nm;

end;

end;

procedure

init;

var i,u,v,z:longint;

begin

readln(n,k);

for k:=1

to k do

begin

readln(z,u,v);

case z of

1:begin

add(u,v,0);

add(v,u,0);

end;

2:begin

if u=v then

begin

write('-1');

halt;

end;

add(u,v,1);

end;

3:add(v,u,0);

4:begin

if u=v then

begin

write('-1');

halt;

end;

add(v,u,1);

end;

5:add(u,v,0);

end;

end;

for i:=1

to n do

add(0,i,1);

bo:=false;

end;

procedure

spfa;

var i,t,x:longint;

begin

fillchar(d,sizeof(d),0);

t:=1;

d[1]:=0; st[1]:=0; v[0]:=true;

while t<>0

dobegin

x:=st[t]; dec(t);

i:=ls[x];

while i<>0

dobegin

if d[a[i].y]then

begin

d[a[i].y]:=d[x]+a[i].w;

ifnot v[a[i].y] then

begin

v[a[i].y]:=true;

inc(t);

st[t]:=a[i].y;

inc(len[a[i].y]);

end;

if len[a[i].y]>n then

begin

bo:=true;

exit;

end;

end;

i:=a[i].next;

end;

v[x]:=false;

end;

end;

procedure

print;

var i:longint;

begin

ans:=0;

for i:=1

to n do

ans:=ans+d[i];

write(ans);

end;

begin

init;

spfa;

if bo then

write('-1') else print;

end.

24點(公升級版)

本24點 可以實現以下操作 查詢4個數經過 和 運算是否可得到nnn 支援僅查詢是否存在和查詢存在的算式 支援多組資料,每組資料結束後請按回車,當n 0 n 0n 0時結束 第一行乙個二進位制數g,0表示不輸出算式,1相反 輸入後過程中不可更改 接下來一行乙個數n nn然後下一行4個數,表示這些數參...

7 5 拯救007(公升級版)(30 分)

在老電影 007之生死關頭 live and let die 中有乙個情節,007被毒販抓到乙個鱷魚池中心的小島上,他用了一種極為大膽的方法逃脫 直接踩著池子裡一系列鱷魚的大腦袋跳上岸去!據說當年替身演員被最後一條鱷魚咬住了腳,幸好穿的是特別加厚的靴子才逃過一劫。設鱷魚池是長寬為100公尺的方形,中...

L2 1 拯救007(公升級版)

l2 1 拯救007 公升級版 25 分 在老電影 007之生死關頭 live and let die 中有乙個情節,007被毒販抓到乙個鱷魚池中心的小島上,他用了一種極為大膽的方法逃脫 直接踩著池子裡一系列鱷魚的大腦袋跳上岸去!據說當年替身演員被最後一條鱷魚咬住了腳,幸好穿的是特別加厚的靴子才逃過...