poj 1273 Drainage Ditches--最大流--Dinic

/*
之前用EK写过这题,现在学dinic,又写了这个题
*/
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int map[205][205],lvl[205];
int n,m,ret;
int bfs()//分层
{
	int u,i;
	memset(lvl,0,sizeof(lvl));
	queue<int>q;
	q.push(1);
	lvl[1]=1;
	while(!q.empty())
	{
		u=q.front();
		q.pop();
		for(i=1;i<=m;i++)
		{
			if(!lvl[i]&&map[u][i]>0)
			{
				lvl[i]=lvl[u]+1;
				q.push(i);
			}
		}
	}
	return lvl[m]!=0;
}
int min(int a,int b){return a<b?a:b;}
int dfs(int u,int ff)//递归求增广路径
{
	int i,z;
	int tt=ff;
	if(u==m) return ff;
	for(i=1;i<=m&&tt;i++)
	{
		if(lvl[i]==lvl[u]+1&&map[u][i]>0)
		{
			z=dfs(i,min(tt,map[u][i]));
			map[u][i]-=z;
			map[i][u]+=z;
			tt-=z;
		}
	}
	return ff-tt;
}
int main()
{
	int i,a,b,c;
	while(scanf("%d %d",&n,&m)!=EOF)
	{
		ret=0;
		memset(map,0,sizeof(map));
		for(i=1;i<=n;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			map[a][b]+=c;
		}
		while(bfs())
			ret+=dfs(1,0x7fffffff);//有的人把这写在了while循环里边,不知道为什么,好像在回溯的时候就会找完增广路径吧?谁知到,给回复个    
		printf("%d\n",ret);
	}
	return 0;
}

你可能感兴趣的:(poj 1273 Drainage Ditches--最大流--Dinic)