【POJ3159】Candies(差分约束系统)

时间:2024-12-19 14:06:14

题意:有一些人,

给n个人派糖果,给出m组约束,每组约束包含A,B,c 三个数,

意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c 。

最后求n 比 1 最多多多少糖果。

n<=30000 m<=150000

思路:显然差分约束系统

dis[a]-dis[b]<=c

即为b->a连长为c的边

跑SPFA+stack即可,用队列会超时

 var dis:array[..]of longint;
head,next,vet,len:array[..]of longint;
inq:array[..]of boolean;
stack:array[..]of longint;
n,m,tot,i,a,b,c:longint; procedure add(a,b,c:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len[tot]:=c;
head[a]:=tot;
end; procedure spfa;
var top,e,v,u:longint;
begin
fillchar(inq,sizeof(inq),false);
for i:= to n do dis[i]:=;
top:=; stack[]:=; inq[]:=true;
while top> do
begin
u:=stack[top]; stack[top]:=; dec(top); inq[u]:=false;
e:=head[u];
while e<> do
begin
v:=vet[e];
if dis[u]+len[e]<dis[v] then
begin
dis[v]:=dis[u]+len[e];
if not inq[v] then
begin
inc(top); stack[top]:=v; inq[v]:=true;
end;
end;
e:=next[e];
end;
end;
end; begin readln(n,m);
for i:= to m do
begin
readln(a,b,c);
add(a,b,c);
end;
spfa;
writeln(dis[n]); end.