算法模板——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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)