网络流sap

版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/qq_35950004/article/details/83659064
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define maxn 1005
#define LL long long
#define inf 0x3f3f3f3f3f3fll
using namespace std;

int n,m,S,T;
LL c[maxn][maxn],stm;
bool flag;

int d[maxn],vd[maxn];

LL aug(int now,LL Max)
{
	if(now==T) return Max;
	LL inc,st=Max;
	int Min=T-1;
	for(int i=1;i<=m && st;i++)
		if(c[now][i])
		{
			if(d[i]+1==d[now])
			{
				inc=aug(i,min(st,c[now][i]));
				c[now][i]-=inc;
				c[i][now]+=inc;
				st-=inc;
				if(flag) return Max-st;
			}
			Min=min(Min,d[i]);
		}
	if(st==Max)
	{
		(!--vd[d[now]]) && (flag=1);
		vd[d[now]=Min+1]++;
	}
	return Max-st;
}

LL sap()
{
	memset(d,0,sizeof d);
	memset(vd,0,sizeof vd);
	vd[0]=T;
	for(stm=flag=0;!flag;stm+=aug(S,inf));
	return stm;
}

int main()
{
	int u,v,w;
	scanf("%d%d",&n,&m);S=1,T=m;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		c[u][v]+=w;
	}
	printf("%lld\n",sap());
}

猜你喜欢

转载自blog.csdn.net/qq_35950004/article/details/83659064