最大流模板

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int min(int a, int b)
{
	return a > b ? b : a;
}

const int inf = 0xfffffff;
#define clr(arr,v) memset(arr,v,sizeof(arr))

template<int MaxV,int MaxE>
class MaxFlow{
public:
	int GetMaxFlow(int s,int t,int n)  //s为源点,t为汇点,n为总点数
	{
		int maxflow = 0,minflow = inf,cur = s;
		Cnt[0] = n;
		memcpy(Cur,H,sizeof(H));
		while(Gap[cur] <= n)
		{
			int &i = Cur[cur];
			for(;i != -1;i = Next[i])
			{
				if(Cap[i]-Flow[i] > 0 && Gap[cur]-Gap[ Num[i] ] == 1)
				{
					pre_edge[ Num[i] ] = i;
					cur = Num[i];
					minflow = min(minflow,Cap[i]-Flow[i]);
					if(cur == t)
					{
						maxflow += minflow;
						while(cur != s)
						{
							Flow[ pre_edge[cur] ] += minflow;
							Flow[ pre_edge[cur]^1 ] -= minflow;
							cur = Num[ pre_edge[cur]^1 ];
						}
						minflow = inf;
					}
					break;
				}
			}
			if(i == -1)
			{
				if(--Cnt[ Gap[cur] ] == 0) return maxflow;
				Gap[cur] = inf;
				i = H[cur];
				for(int j = H[cur];j != -1;j = Next[j])
					if(Cap[j] > Flow[j] && Gap[ Num[j] ] < Gap[cur])
						Gap[cur] = Gap[ Num[j] ];
				if(Gap[cur] != inf) ++Cnt[ ++Gap[cur] ];
				cur = s;
			}
		}
		return maxflow;
	}
	void add(int u,int v,int flow)
	{
		Num[pos] = v;
		Cap[pos] = flow;
		Next[pos] = H[u];
		H[u] = pos++;

		Num[pos] = u;
		Cap[pos] = 0;
		Next[pos] = H[v];
		H[v] = pos++;
	}
	void clear()
	{
		clr(H,-1); clr(Flow,0); clr(Cnt,0);
		clr(Gap,0); pos = 0;
	}
private:
	int H[MaxV],Cur[MaxV],Num[MaxE],Next[MaxE];
	int Cap[MaxE],Flow[MaxE],Cnt[MaxV];
	int Gap[MaxV],pre_edge[MaxE],pos;
};
MaxFlow<点的最大个数,边的最大个数> g;
最好设置为0为源点,最后一个点 +1为汇点
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值