算法模板——Dinic最小费用最大流
实现功能:输入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.
算法模板——Dinic最小费用最大流的更多相关文章
- P3381 【模板】最小费用最大流
P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...
- 费用流+SPFA ||Luogu P3381【模板】最小费用最大流
题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...
- 费用流+SPFA ||【模板】最小费用最大流
题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...
- P3381 【模板】最小费用最大流(MCMF)
P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式 第一行包含四个正整数N ...
- 洛谷P3381 - 【模板】最小费用最大流
原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...
- Luogu--3381 【模板】最小费用最大流
题目链接 3381 [模板]最小费用最大流 手写堆版本 dijkstra 400+ms 看来优先队列的常数好大 #include<bits/stdc++.h> using namesp ...
- Luogu P3381 (模板题) 最小费用最大流
<题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...
- 最小费用最大流 学习笔记&&Luogu P3381 【模板】最小费用最大流
题目描述 给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 题目链接 思路 最大流是没有问题的,关键是同时保证最小费用,因此,就可以把 ...
- 最小费用最大流(luogu P3381 【模板】最小费用最大流)
题目链接 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S. ...
随机推荐
- JSP中使用Taglib
http://blog.163.com/jany_1016/blog/static/4604400620091112114127341/ http://blog.csdn.net/yuebinghao ...
- Java内存回收优化及配置
原文链接:http://eol.cqu.edu.cn/eol/jpk/course/preview/jpkmaterials_folder_txtrtfview.jsp?resId=23156& ...
- Hadoop学习笔记-003-CentOS_6.5_64_设置ssh免密码登录
参考:http://blog.csdn.net/u010270403/article/details/51444677 虚拟机中共五个centos系统,每个系统有两个用户root和hadoop:cdh ...
- oracle sql 知识小结
Oracle_sql : 第一单元:select 语句: ①:字符串连接操作符: || ②:去除重复行:distinct 第二单元:条件限制和排序 ①:关键字:where ②:比较操作符:=,&g ...
- java版二叉树算法实现
import java.util.ArrayList; class BinaryTree { private static class TreeNode { int data; TreeNode le ...
- asp.net权限认证:OWIN实现OAuth 2.0 之简化模式(Implicit)
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- jquery的deferred异步
推荐方法: var wait = function(dtd){ var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象 var tasks = function( ...
- 基于Selenium2+Java的UI自动化(6)-操作Alert、confirm、prompt弹出框
alert.confirm.prompt这样的js对话框在selenium1 时代处理起来比价麻烦,常常要用autoit来帮助处理.而现在webdriver对这些弹出框做了专门的处理,使用seleni ...
- 访问内网中的sql server数据库的简便方法
前言: 有时候我们要访问局域网内的 sql server服务器,比如测试环境数据库在公司内网,回到家或在客户现场要连接内网中的数据库 第一步:假如可以连接局域网的数据库 192.168.150.129 ...
- Markdown 标记语言简介
简介 做为一种标记语言,广泛应用在写作领域,markdown语法编写的文本,经过特殊的软件进行展示: 目的:相对html,markdown提高文本的可读可写性 兼容:兼容html 自动转换特殊字符:& ...