題目描述
幼兒園裡有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被毒販抓到乙個鱷魚池中心的小島上,他用了一種極為大膽的方法逃脫 直接踩著池子裡一系列鱷魚的大腦袋跳上岸去!據說當年替身演員被最後一條鱷魚咬住了腳,幸好穿的是特別加厚的靴子才逃過...