实现功能:输入M,N,S,T;接下来M行输入M条弧的信息(包括起点,终点,流量,单位费用);实现功能是求出以S为源点,T为汇点的网络最大流的最小费用

其实相当的像Dinic最大流呐= =

还是spfa处理出最短路径(注意,这次是最短路径,所以时空复杂度将有所提高,害得我都开循环队列了TT),然后顺着最短路径顺藤摸瓜找回去,求出流大小和最小的费用,然后,没有然后了,程序还是一样的好懂么么哒(HansBug:感觉Dinic算法真心超级喜感,为啥我之前就没发现呢= =,还有鸣谢wnjxyk神犇提供的C++模板么么哒 Wnjxyk:^_^)

(本程序为BZOJ1927的AC程序,模板题么么哒,还有其实感觉spfa函数里面每次清空e数组貌似不是很必要,但还是图个安心写下吧)

 const maxl=;
type
point=^node;
node=record
g,w,f:longint;
next,anti:point;
end;
var
a,e:array[..] of point;
i,j,k,l,m,n,s,t,ans,flow:longint;
c,g:array[..] of longint;
d:array[..maxl] of longint;
function min(x,y:longint):longint;
begin
if x<y then min:=x else min:=y;
end;
procedure swap(var x,y:longint);
var z:longint;
begin
z:=x;x:=y;y:=z;
end;
procedure add(x,y,z,t:longint);
var p:point;
begin
new(p);p^.g:=y;p^.w:=z;p^.f:=t;p^.next:=a[x];a[x]:=p;
new(p);p^.g:=x;p^.w:=;p^.f:=-t;p^.next:=a[y];a[Y]:=p;
a[x]^.anti:=a[y];a[y]^.anti:=a[x];
end;
function spfa:boolean; //神(dou)奇(bi)的最短路径预处理
var f,r:longint;p:point;
begin
for i:=s to t do c[i]:=maxlongint;
for i:=s to t do e[i]:=nil;
d[]:=s;f:=;r:=;g[s]:=;c[s]:=;
while f<>r do
begin
p:=a[d[f]];
while p<>nil do
begin
if (p^.w<>) and (c[p^.g]>(c[d[f]]+p^.f)) then
begin
c[p^.g]:=c[d[f]]+p^.f;
e[p^.g]:=p;
if g[p^.g]= then
begin
g[p^.g]:=;
d[r]:=p^.g;r:=(r mod maxl)+;
end;
end;
p:=p^.next;
end;
g[d[f]]:=;f:=(f mod maxl)+;
end;
exit(c[t]<>maxlongint);
end;
procedure calc;
begin
l:=maxlongint;
i:=t;
while i<>s do
begin
l:=min(l,e[i]^.w);
i:=e[i]^.anti^.g; //当前弧的反向弧所指向的点就是你要回到的点^_^
end;
i:=t;inc(flow,l);
while i<>s do
begin
if e[i]^.w<>maxlongint then dec(e[i]^.w,l);
if e[i]^.anti^.w<>maxlongint then inc(e[i]^.anti^.w,l);
inc(ans,e[i]^.f*l);
i:=e[i]^.anti^.g;
end;
end;
begin
readln(n,m);s:=;t:=*n+;
for s:= to t do a[i]:=nil;
for i:= to n do
begin
read(l);
add(,i,,);
add(i+n,t,,);
add(,i+n,,l);
end;
readln;
for i:= to m do
begin
readln(j,k,l);
if j>k then swap(j,k);
add(j,k+n,,l);
end;
flow:=;ans:=; //flow表示最大流;ans表示最小费用
while spfa do calc;
writeln(ans);
readln;
end.

最新文章

  1. 实用的Portraiture滤镜磨皮教程
  2. android studio 导入工程问题总结
  3. SA
  4. careercup-栈与队列 3.4
  5. CVPR2011录取结果
  6. Java基础知识强化97:final、finally、finally区别
  7. 记录下url拼接的多条件筛选js
  8. OleDbCommand cmd.Parameters.AddWithValue 添加参数时需要按照存储过程参数的顺序加入
  9. Code Complete
  10. 用R画有图例的中国地图
  11. 如何使用 Bootstrap 搭建更合理的 HTML 结构
  12. python爬取网易云周杰伦所有专辑,歌曲,评论,并完成可视化分析
  13. C#中转换函数Convert、Parse、TryParse、(int) 的区别
  14. Kafka三款监控工具比较
  15. apt小问题
  16. 利用arpspoof探取账户密码
  17. 【微信小程序】实现类似WEB端【返回顶部】功能
  18. python 进程与线程(理论部分)
  19. spark 例子wordcount topk
  20. 20155236 2016-2017-2《Java程序设计》课程总结

热门文章

  1. 细数JDK里的设计模式
  2. JS可维护性代码
  3. Hadoop权威指南:数据完整性
  4. 新年上班第一天,我的 IDE 挂了
  5. Kafka 0.10 Metadata的补充
  6. C++编程练习(2)----“实现简单的线性表的链式存储结构“
  7. node Express安装与使用(一)
  8. PHP静态成员变量
  9. git用法-打补丁
  10. 转载 JDK + Android-SDK + Python + MonkeyRunner 的安装