zoukankan      html  css  js  c++  java
  • 算法模板——Dinic网络最大流 2

    实现功能:同Dinic网络最大流 1

    这个新的想法源于Dinic费用流算法。。。

    在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路

    于是在这个里面我的最大流也采用这种模式,这样子有效避免的递归,防止了爆栈么么哒

     1 type
     2     point=^node;
     3     node=record
     4                g,w:longint;
     5                next,anti:point;
     6     end;
     7 var
     8    i,j,k,l,m,n,s,t,flow:longint;
     9    a,e:array[0..10000] of point;
    10    c,d:array[0..10000] of longint;
    11 function min(x,y:longint):longint;
    12          begin
    13               if x<y then min:=x else min:=y;
    14          end;
    15 procedure add(x,y,z:longint);
    16           var p:point;
    17           begin
    18                new(p);p^.g:=y;p^.w:=z;p^.next:=a[x];a[x]:=p;
    19                new(p);p^.g:=x;p^.w:=0;p^.next:=a[y];a[y]:=p;
    20                a[x]^.anti:=a[y];a[y]^.anti:=a[x];
    21           end;
    22 function spfa:boolean;
    23          var p:point;f,r:longint;
    24          begin
    25               fillchar(c,sizeof(c),255);
    26               d[1]:=s;f:=1;r:=2;c[s]:=0;
    27               while f<r do
    28                     begin
    29                          p:=a[d[f]];
    30                          while p<>nil do
    31                                begin
    32                                     if (p^.w<>0) and (c[p^.g]=-1) then
    33                                        begin
    34                                             c[p^.g]:=c[d[f]]+1;
    35                                             e[p^.g]:=p;
    36                                             d[r]:=p^.g;inc(r);
    37                                        end;
    38                                     p:=p^.next;
    39                                end;
    40                          inc(f);
    41                     end;
    42               exit(c[t]<>-1);
    43          end;
    44 procedure calc;   //“顺藤摸瓜”模式有效避免了递归带来的爆栈隐患
    45           begin
    46                i:=t;l:=maxlongint;
    47                while i<>s do
    48                      begin
    49                           l:=min(l,e[i]^.w);
    50                           i:=e[i]^.anti^.g;
    51                      end;
    52                i:=t;inc(flow,l);
    53                while i<>s do
    54                      begin
    55                           if e[i]^.w<>maxlongint then dec(e[i]^.w,l);
    56                           if e[i]^.anti^.w<>maxlongint then inc(e[i]^.anti^.w,l);
    57                           i:=e[i]^.anti^.g;
    58                      end;
    59           end;
    60 begin
    61      readln(m,n,s,t);
    62      for i:=1 to n do a[i]:=nil;
    63      for i:=1 to m do
    64          begin
    65               readln(j,k,l);
    66               add(j,k,l);
    67          end;
    68      flow:=0;while spfa do calc;
    69      writeln(flow);
    70      readln;
    71 end.
  • 相关阅读:
    java 多级图的最短路径
    在dos中编译java文件
    apollo客户端的长轮询机制的原理
    Apollo配置中心动态生效实现原理
    jmx_exporter+prometheus+grafana实现kafka metric监控
    XXL-JOB(1) 分布式任务系统选型和XXL-JOB介绍,这篇文章相当的经典呀
    grafana根据不同prometheus server统计数据
    XXL-JOB的使用教程
    普罗米修斯官方文档
    Prometheus标签的管理
  • 原文地址:https://www.cnblogs.com/HansBug/p/4440085.html
Copyright © 2011-2022 走看看