网络流模板 —— Dinic算法(弧优化),最小费用最大流

学了几天感觉对网络流算是入门了,稍稍整理一下,同时在学习网络流的过程中看到了三篇别人很不错的blog(如下)

感谢 ~~

网络流相关定义及原理:https://www.cnblogs.com/rmy020718/p/9546071.html

Dinic算法+弧优化:https://www.cnblogs.com/SYCstudio/p/7260613.html

网络流常见建模方法:https://www.cnblogs.com/victorique/p/8560656.html

网络流关键的是图的建立,尤其是在匹配问题中,超级源点和汇点的建立和连接,再者就是对最大流算法的选择。



Dinic算法+弧优化

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn;      //最大结点总个数
const int maxm;      //最大边的总条数:注意要包括反向边个数,即总条数=正向边总条数*2
int s;               //源点
int t;               //汇点
int head[maxn];      //点u邻接表的第一条边
int cnt;             //边的数量,从0开始编号
struct edge
{
   
	int w;           //边的流量(残量)
	int to;          //该边通向的结点v
	int next;        //点u邻接表的下一条边
}e[maxm];
void addedge(int u,int v,int w)   //添加一条u->v,最大容量为w的边
{
   
    //建立正向边
	e[cnt].w=w;
	e[cnt].to=v;
	e[cnt].next=head[u];     
	head[u]=cnt;
	cnt++;
	//建立反向边
	e[cnt].w=0;        //有些图是需要建立双向边(例如求最小割时),则反向边的初始残量不为0
	e[cnt].to=u;
	e[cnt].next=head[v];
	head[v]=cnt;
	cnt++;
}
int dis[maxn];     //dis数组记录层次
bool bfs()         //利用BFS建立分成图,从而可以多次DFS增广
{
   
	memset(dis,-1,sizeof(dis));     //初始化dis数组
	queue<int> q;
	q.push(s);
	dis[s]=0;      //源点层次为0
	while(!q.empty())
	{
   
		int u=q.front();
		q.pop()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值