直接上大佬博客:

Dinic算法详解及实现来自小菲进修中

Dinic算法(研究总结,网络流)来自SYCstudio

  模板步骤:

  第一步,先bfs把图划分成分成分层图网络

  第二步,dfs多次找增广路

  当前弧优化:即每一次dfs增广时不从第一条边开始,而是用一个数组cur记录点u之前循环到了哪一条边,以此来加速

POJ - 1273Drainage Ditches

  裸的最大流,直接按题意建图跑就行

 #include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int N=,inf=;
struct Side{
int v,ne,w;
}S[N<<];
int n,sn,head[N],cur[N],dep[N];
void init()
{
sn=;
for(int i=;i<=n;i++)
head[i]=-;
}
void add(int u,int v,int w)
{
S[sn].v=v;
S[sn].w=w;
S[sn].ne=head[u];
head[u]=sn++;
}
void addE(int u,int v,int w)
{
add(u,v,w);
add(v,u,);
}
bool bfs()
{
queue<int> q;
for(int i=;i<=n;i++)
dep[i]=;
dep[]=;
q.push();
int x,y;
while(!q.empty())
{
x=q.front();
q.pop();
for(int i=head[x];~i;i=S[i].ne)
{
y=S[i].v;
if(S[i].w>&&!dep[y])
{
dep[y]=dep[x]+;
q.push(y);
}
}
}
return dep[n]!=;
}
int dfs(int u,int minf)
{
if(u==n||!minf)
return minf;
int v,flow;
for(int &i=cur[u];~i;i=S[i].ne)
{
v=S[i].v;
if(dep[v]==dep[u]+&&S[i].w>)
{
flow=dfs(v,min(minf,S[i].w));
if(flow)
{
S[i].w-=flow;
S[i^].w+=flow;
return flow;
}
}
}
return ;
}
int dinic()
{
int ans=,flow;
while(bfs())
{
for(int i=;i<=n;i++)
cur[i]=head[i];
while(flow=dfs(,inf))
ans+=flow;
}
return ans;
}
int main()
{
int m,u,v,w;
while(~scanf("%d%d",&m,&n))
{
init();
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
addE(u,v,w);
}
printf("%d\n",dinic());
}
return ;
}

小桥流水人家

POJ - 1698Alice's Chance

  也是个裸的最大流,不过得看得出来,就把每周每天视为节点,然后弄个汇点跟源点,跑一遍dinic看最大流是不是总要求的天数

 #include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int N=,inf=;
struct Side{
int v,ne,w;
}S[N<<];
struct Film{
int ok[],day,week;
}F[N];
int n,sn,sum,sb,se,head[N],cur[N],dep[N];
void init()
{
sn=,sum=;
sb=,se=n+;
for(int i=;i<=se;i++)
head[i]=-;
}
void add(int u,int v,int w)
{
S[sn].v=v;
S[sn].w=w;
S[sn].ne=head[u];
head[u]=sn++;
}
void addE(int u,int v,int w)
{
add(u,v,w);
add(v,u,);
}
bool bfs()
{
queue<int> q;
for(int i=;i<=se;i++)
dep[i]=;
dep[sb]=;
q.push(sb);
int u,v;
while(!q.empty())
{
u=q.front();
q.pop();
for(int i=head[u];~i;i=S[i].ne)
{
v=S[i].v;
if(S[i].w>&&!dep[v])
{
dep[v]=dep[u]+;
q.push(v);
}
}
}
return dep[se]!=;
}
int dfs(int u,int minf)
{
if(u==se||!minf)
return minf;
int v,flow;
for(int &i=cur[u];~i;i=S[i].ne)
{
v=S[i].v;
if(S[i].w>&&dep[v]==dep[u]+)
{
flow=dfs(v,min(minf,S[i].w));
if(flow>)
{
S[i].w-=flow;
S[i^].w+=flow;
return flow;
}
}
}
return ;
}
int dinic()
{
int ans=,flow;
while(bfs())
{
for(int i=;i<=se;i++)
cur[i]=head[i];
while(flow=dfs(sb,inf))
ans+=flow;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
init();
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)
scanf("%d",&F[i].ok[j]);
scanf("%d%d",&F[i].day,&F[i].week);
sum+=F[i].day;
}
for(int i=;i<=n;i++)
addE(sb,i,F[i].day);
for(int i=;i<=n;i++)
{
for(int j=;j<F[i].week;j++)
for(int k=;k<=;k++)
if(F[i].ok[k])
addE(i,n+j*+k,);
}
for(int i=;i<;i++)
for(int j=;j<=;j++)
addE(n+i*+j,se,);
if(dinic()>=sum)
printf("Yes\n");
else
printf("No\n");
}
return ;
}

one day day

HDU 3605Escape

  100000个人,但才10个星球,在建图上,把可以去的星球状态相同的人视为一样的,这样最多就才1024个状态,然后跑一遍dinic,c++直接交,g++的话得用快读。

 #include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int N=<<,inf=;
struct Side{
int v,ne,w;
}S[N<<];
int sn,pb,pe,n,m,head[N],cur[N];
int cf2[]={},man[N],dep[N];
//int read()
//{
// int res = 0, flg = 1; char chr = getchar();
// while(chr < '0' || chr > '9') {if(chr == '-') res = -1; chr = getchar();}
// while(chr <= '9' && chr >= '0') {res = res * 10 + chr - '0'; chr = getchar();}
// return res * flg;
//}g++用快读
void init()
{
sn=;
pb=,pe=cf2[m]+m;
for(int i=;i<cf2[m];i++)
man[i]=;
for(int i=;i<=pe;i++)
head[i]=-;
}
void add(int u,int v,int w)
{
S[sn].w=w;
S[sn].v=v;
S[sn].ne=head[u];
head[u]=sn++;
}
void addE(int u,int v,int w)
{
add(u,v,w);
add(v,u,);
}
bool bfs()
{
for(int i=;i<=pe;i++)
dep[i]=;
dep[pb]=;
queue<int> q;
q.push(pb);
int u,v;
while(!q.empty())
{
u=q.front();
q.pop();
for(int i=head[u];~i;i=S[i].ne)
{
v=S[i].v;
if(S[i].w>&&!dep[v])
{
dep[v]=dep[u]+;
q.push(v);
}
}
}
return dep[pe]!=;
}
int dfs(int u,int minf)
{
if(u==pe||!minf)
return minf;
int v,flow;
for(int &i=cur[u];~i;i=S[i].ne)
{
v=S[i].v;
if(S[i].w>&&dep[v]==dep[u]+)
{
flow=dfs(v,min(minf,S[i].w));
if(flow)
{
S[i].w-=flow;
S[i^].w+=flow;
return flow;
}
}
}
return ;
}
int dinic()
{
int maxf=,flow;
while(bfs())
{
for(int i=;i<=pe;i++)
cur[i]=head[i];
while(flow=dfs(pb,inf))
maxf+=flow;
}
return maxf;
}
int main()
{
for(int i=;i<=;i++)
cf2[i]=cf2[i-]<<;
int num,x;
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=;i<=n;i++)
{
num=;
for(int j=;j<m;j++)
{
scanf("%d",&x);
if(x)
num|=cf2[j];
}
man[num]++;
}
for(int i=;i<cf2[m];i++)
if(man[i])
{
addE(pb,i,man[i]);
for(int j=;j<m;j++)
if(i&cf2[j])
addE(i,cf2[m]+j,man[i]);
}
for(int i=;i<m;i++)
{
scanf("%d",&x);
addE(cf2[m]+i,pe,x);
}
if(dinic()>=n)
printf("YES\n");
else
printf("NO\n");
}
return ;
}

流浪星球

  啊,网络流就在于建图。

我爱网络流之最大流Dinic的更多相关文章

  1. 网络流之最大流Dinic算法模版

    /* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...

  2. 网络流之最大流Dinic --- poj 1459

    题目链接 Description A power network consists of nodes (power stations, consumers and dispatchers) conne ...

  3. 网络流(最大流-Dinic算法)

    摘自https://www.cnblogs.com/SYCstudio/p/7260613.html 网络流定义 在图论中,网络流(Network flow)是指在一个每条边都有容量(Capacity ...

  4. [Poj2112][USACO2003 US OPEN] Optimal Milking [网络流,最大流][Dinic+当前弧优化]

    题意:有K个挤奶机编号1~K,有C只奶牛编号(K+1)~(C+K),每个挤奶机之多能挤M头牛,现在让奶牛走到挤奶机处,求奶牛所走的最长的一条边至少是多少. 题解:从起点向挤奶机连边,容量为M,从挤奶机 ...

  5. 学习笔记 --- 最大流Dinic算法

    为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...

  6. 【Luogu2711】小行星(网络流,最大流)

    [Luogu2711]小行星(网络流,最大流) 题面 题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最 ...

  7. 网络流(四)dinic算法

    传送门: 网络流(一)基础知识篇 网络流(二)最大流的增广路算法 网络流(三)最大流最小割定理 网络流(四)dinic算法 网络流(五)有上下限的最大流 网络流(六)最小费用最大流问题 转自:http ...

  8. HDU 3416 Marriage Match IV (最短路径,网络流,最大流)

    HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...

  9. HDU 3605 Escape (网络流,最大流,位运算压缩)

    HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...

随机推荐

  1. 牛客 P21336 和与或 (数位dp)

    大意: 给定数组$R$, 求有多少个数组$A$, 满足$0\le A_i \le R_i$且$A_0+...+A_{N-1}=A_0\space or ...\space or \space A_{N ...

  2. 三调数据库标注插件v1.3

    三调数据库标注插件 插件介绍: 本插件基于VS2010+ARCGIS Addin 开发,高效率处理三调数据,可以标注相关属性.检查尖角.检查节点平均密度.检查地类图斑属性一致性,方便数据导入建库软件之 ...

  3. Oracle学习笔记:ASCII码转换(chr和ascii函数)

    今天get到一个骚操作,通过ascii码转换之后来进行互换编码的. select chr(ascii('f') + ascii('m') - ascii('a')) from dual; 有必要对as ...

  4. 在eclipse导入项目的步骤

    1. Import 2. Next 3. 确定  选中copy projects into workspace    Finish 这样项目就导入进来了. 4.导入jar包 Configure Bui ...

  5. Centos 6.5 版本的下载教程

    1.CentOS下载CentOS是免费版,推荐在官网上直接下载,网址:https://www.centos.org/download/ 2.选择版本推荐6.5 3.选择isos 4.根据系统电脑的配置 ...

  6. 【Java并发】线程安全和内存模型

    一.概述 1.1 什么是线程安全? 1.2 案例 1.3 线程安全解决办法: 二.synchronized 2.1 概述 2.2 同步代码块 2.3 同步方法 2.4 静态同步函数 2.5 总结 三. ...

  7. 第五章、前端之JQuery

    目录 第五章.前端之JQuery 一.选择器 二.基本筛选器 三.样式操作 四.位置操作 五.文本操作 六.属性操作 七.文档处理 八.事件 九.动画效果 十.补充 第五章.前端之JQuery 一.选 ...

  8. 飞漫魏永明:从MiniGUI看嵌入式十年得与失

    日前,飞漫软件创始人魏永明,在飞漫成立十周年之际,回顾了公司发展这十年,同时也回顾了嵌入式发展的这十年.魏永明以自身涉及嵌入式产业的方方面面,创新.人员管理.工程管理.教育培训.经营策略等多方面,并且 ...

  9. python django中的orm外键级联删除

    今天添加了一个路由表,路由表做外键,然后添加了几个组,路由表为组的外键,当我使用删除功能对路由表进行删除时,竞然将我的组也相当的删除了:尽管这是测试,但放到生产环境中还是会发生意外的:这个问题要解决: ...

  10. macos下简单的socket服务器+客户端

    TCP客户端服务器编程模型: 服务器: 调用socket函数创建套接字 调用bind绑定本地IP和端口 调用listen启动监听(准备好接收客户端链接的队列) 调用accept从已连接队列中提取第一个 ...