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

题意:有一些人,

给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.

 

posted on 2017-04-17 13:58  myx12345  阅读(136)  评论(0编辑  收藏  举报

导航