• 【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.
  • 相关阅读:
    通过5G网络释放触觉互联网的力量
    架构师的主要职责和一些误区
    Codeforces 305E Playing with String
    hdu3949:XOR
    bzoj1923: [Sdoi2010]外星千足虫
    bzoj1013: [JSOI2008]球形空间产生器sphere
    bzoj1770: [Usaco2009 Nov]lights 灯
    一些还没有写的AC自动机题
    bzoj2553: [BeiJing2011]禁忌
    bzoj1030: [JSOI2007]文本生成器
  • 原文地址:https://www.cnblogs.com/myx12345/p/6722624.html
Copyright © 2020-2023  润新知