procedure addedge(u,v,cap:longint);
begin
sid[tot].u:=u;
sid[tot].v:=v;
sid[tot].cap:=cap;
sid[tot].next:=nd[u];
nd[u]:=tot;
inc(tot);
sid[tot].u:=v;
sid[tot].v:=u;
sid[tot].cap:=0;
sid[tot].next:=nd[v];
nd[v]:=tot;
inc(tot);
end;
 function bfs:boolean;
var
i,head,tail,u,p:longint;
begin
for i:=0 to n*m+1 do
dep[i]:=-1;
dep[0]:=0;
head:=1;tail:=1;dl[1]:=0;
while head<=tail do
begin
u:=dl[head];
p:=nd[dl[head]];
while p<>-1 do
begin
if (sid[p].cap>0) and (dep[sid[p].v]=-1) then
begin
dep[sid[p].v]:=dep[u]+1;
if sid[p].v=n*m+1 then exit(true);
inc(tail);
dl[tail]:=sid[p].v;
end;
p:=sid[p].next;
end;
inc(head);
end;
exit(false);
end; function dinic:longint;
var
top,i,u,mi,last:longint;
begin
dinic:=0;
while bfs do
begin
fillchar(stack,sizeof(stack),0);
top:=0;
for i:=0 to n*m+1 do cur[i]:=nd[i];
u:=0;
while true do
begin
if u=n*m+1 then
begin mi:=maxlongint;
for i:=1 to top do
begin
if sid[stack[i]].cap<mi then
begin
last:=i;
mi:=sid[stack[i]].cap;
end;
end; for i:=1 to top do
begin
dec(sid[stack[i]].cap,mi);
inc(sid[stack[i] xor 1].cap,mi);
end; top:=last-1;
dinic:=dinic+mi;
u:=sid[stack[last]].u;
end; while cur[u]<>-1 do
begin
if (dep[sid[cur[u]].v]=dep[u]+1) and (sid[cur[u]].cap<>0) then break
else cur[u]:=sid[cur[u]].next;
end; if cur[u]=-1 then
begin
if u=0 then break;
dep[u]:=-1;
u:=sid[stack[top]].u;
dec(top);
end else
begin
inc(top);
stack[top]:=cur[u];
u:=sid[cur[u]].v;
end;
end;
end;
end;
 

最大流=最小割=正点权和-最大闭合权图

其中求最大闭合权图时,源点向所有点权为正的点连容量为点权的边,所有点权为负的点向汇点连容量为点权绝对值的边

表示约束关系的边容量为无穷大,i前必须做j,i连向j

-----------------------------------------------------------------------------------------------

  void addedge2(int u,int v,int cap){
sid[cnt].next=nd[u];sid[cnt].des=v;sid[cnt].cap=cap;nd[u]=cnt;sid[cnt].fr=u;cnt++;
sid[cnt].next=nd[v];sid[cnt].des=u;sid[cnt].cap=;nd[v]=cnt;sid[cnt].fr=v;cnt++;
} int bfs(){
memset(dep,-,sizeof(dep)); int head=,tail=;
dep[sor]=;dl[head]=sor;
while (head<=tail){
for (int p=nd[dl[head]];p!=-;p=sid[p].next)
if ((dep[sid[p].des]==-)&&(sid[p].cap)) dep[sid[p].des]=dep[dl[head]]+,dl[++tail]=sid[p].des;
head++;
} if (dep[tar]==-) return();else return();
} int dinic(){
int maxflow=;
while (bfs()){
for (int i=;i<=tar;i++) cur[i]=nd[i]; int u=sor,top=;
while(){
if (u==tar){
int mi=1e9,last;
for (int i=;i<=top;i++)
if (sid[sta[i]].cap<mi)
{mi=sid[sta[i]].cap;last=i;} for (int i=;i<=top;i++)
sid[sta[i]].cap-=mi,sid[sta[i]^].cap+=mi;
u=sid[sta[last]].fr;cur[u]=sid[cur[u]].next;top=last-;
maxflow+=mi;
continue;
} while((cur[u]!=-)&&((sid[cur[u]].cap==)||(dep[sid[cur[u]].des]!=dep[u]+)))
cur[u]=sid[cur[u]].next; if (cur[u]!=-){sta[++top]=cur[u];u=sid[cur[u]].des;continue;}
else{
if (u==sor) break;
dep[u]=-;
u=sid[sta[top--]].fr;
continue;
}
}
}
return(maxflow);
}

dinic模板的更多相关文章

  1. hdu 1532 Dinic模板(小白书)

    hdu1532 输入n,m. n条边,m个点,之后给出a到b的容量,求1到m的最大流. 注意:Dinic只能调用一次,因为原理是改变cap的值,如果调用多次一样的,那么第一次会对,其余的都会是0,因为 ...

  2. 最大流算法 ISAP 模板 和 Dinic模板

    ISAP // UVa11248 Frequency Hopping:使用ISAP算法,加优化 // Rujia Liu struct Edge { int from, to, cap, flow; ...

  3. POJ 1273 Drainage Ditches (网络流Dinic模板)

    Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...

  4. 洛谷P3376【模板】网络最大流  Dinic模板

    之前的Dinic模板照着刘汝佳写的vector然后十分鬼畜跑得奇慢无比,虽然别人这样写也没慢多少但是自己的就是令人捉急. 改成邻接表之后快了三倍,虽然还是比较慢但是自己比较满意了.虽然一开始ecnt从 ...

  5. 【网络流#3】hdu 1532 - Dinic模板题

    输入为m,n表示m条边,n个结点 记下来m行,每行三个数,x,y,c表示x到y的边流量最大为c 这道题的模板来自于网络 http://blog.csdn.net/sprintfwater/articl ...

  6. 最大流当前弧优化Dinic模板

    最大流模板: 普通最大流 无向图限制:将无向图的边拆成2条方向相反的边 无源汇点有最小流限制的最大流:理解为水管流量形成循环,每根水管有流量限制,并且流入量等于流出量 有源汇点的最小流限制的最大流 顶 ...

  7. 网络流--最大流dinic模板

    标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 #include<stdio.h> //差不多要加这么些头文件 #includ ...

  8. HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. POJ1459Power Network(dinic模板)

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 25832   Accepted: 13481 D ...

随机推荐

  1. js相对路径相关(比如:js中的路径依赖导入该js文件的路径)

    问题描述: 前几天调用同事的js接口文件,在他自己的html测试页面ok,在我这边调用时出现问题. debug过程中,将该测试html移到其他位置都不行,放到原html测试页面同层次路径下是OK的. ...

  2. oracle学习笔记系列------oracle 基本操作之基本函数的用法

    --创建一个accout账户表 CREATE TABLE account( id ) NOT NULL, recommender_id ), login_name ) NOT NULL, login_ ...

  3. centos7系统下安装nodejs开发环境

    1)安装基础工具(if not exists) yum install -y net telnet tools vim wget ntp 2)同步系统时间(if necessary) ntpdate ...

  4. [转载] python的sorted函数对字典按key排序和按value排序

    1.sorted函数按key值对字典排序 先来基本介绍一下sorted函数,sorted(iterable,key,reverse),sorted一共有iterable,key,reverse这三个参 ...

  5. TCP校验和的原理和实现

        http://blog.csdn.net/zhangskd/article/details/11770647 分类: Linux TCP/IP Linux Kernel 2013-09-24 ...

  6. Sqlserver2008R2 数据库镜像配置步骤

    Sqlserver2008镜像功能可以保障数据库的高可用性.数据库镜像维护着数据库的两个副本,这两个副本必须分别放置在不同的SQL Server数据库实例中.可以用两台服务器也可以用一台服务器的不同实 ...

  7. 【转载】阎焱:90后创业是扯淡 大量O2O和P2P公司濒临倒闭

    真正创业成功的大部分是年龄在30岁到38岁之间,很多90后基本什么都不懂.从历史来看,在这样的人口大国,集体性行为,无论是政治的还是经济的,基本都是导致灾难性后果. 10月14日消息,赛富基金创始首席 ...

  8. Remote Displayer for Android V1.2

    VERSION LOG for Android Remote Displayer Features:The app allows you to see your Android device remo ...

  9. AngularJS XMLHttpRequest

    $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据. 读取 JSON 文件 下是存储在web服务器上的 JSON 文件: { "records": [ ...

  10. AC日记——统计单词数 openjudge 1.12 5

    05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...