题意:有一些人,
给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即可,用队列会超时
1 var dis:array[1..200000]of longint; 2 head,next,vet,len:array[1..300000]of longint; 3 inq:array[1..300000]of boolean; 4 stack:array[0..300000]of longint; 5 n,m,tot,i,a,b,c:longint; 6 7 procedure add(a,b,c:longint); 8 begin 9 inc(tot); 10 next[tot]:=head[a]; 11 vet[tot]:=b; 12 len[tot]:=c; 13 head[a]:=tot; 14 end; 15 16 procedure spfa; 17 var top,e,v,u:longint; 18 begin 19 fillchar(inq,sizeof(inq),false); 20 for i:=2 to n do dis[i]:=1234567890; 21 top:=1; stack[1]:=1; inq[1]:=true; 22 while top>0 do 23 begin 24 u:=stack[top]; stack[top]:=0; dec(top); inq[u]:=false; 25 e:=head[u]; 26 while e<>0 do 27 begin 28 v:=vet[e]; 29 if dis[u]+len[e]<dis[v] then 30 begin 31 dis[v]:=dis[u]+len[e]; 32 if not inq[v] then 33 begin 34 inc(top); stack[top]:=v; inq[v]:=true; 35 end; 36 end; 37 e:=next[e]; 38 end; 39 end; 40 end; 41 42 begin 43 44 readln(n,m); 45 for i:=1 to m do 46 begin 47 readln(a,b,c); 48 add(a,b,c); 49 end; 50 spfa; 51 writeln(dis[n]); 52 53 end.