Cod sursa(job #544508)

Utilizator c_adelinaCristescu Adelina c_adelina Data 1 martie 2011 18:44:27
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#include <deque>
#define N 1003
using namespace std;

int flow[N][N],dist[N],edges[N][N],n,ok[N];

deque <int> que;

int do_df(int node, int cap) {
	if (cap == 0)
		return 0;
	if (node == n-1)
		return cap;
	ok[node]=1;
	int bag = 0;
	for (int i = 1; i <= edges[node][0]; ++i) 
	{
		const int next = edges[node][i];
		if ((flow[node][next] == 0) && (ok[next]==1))
			continue;

		const int r = do_df(next, min(cap-bag, flow[node][next]));
		if (r) {
			flow[node][next] -= r;
			flow[next][node] += r;
			bag += r;
		}
	}
	ok[node]=0;
	return bag;
}


int main()
{
	int i,m,a,b,c,now=1,sol=0;
	
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d %d",&n,&m);
	
	for (i=1;i<=m;++i)
	{
		scanf("%d %d %d",&a,&b,&c);
		flow[a-1][b-1]=c;
	}
	while (now>0)
	{
	for (i=1;i<n;++i) dist[i]=0;	
	dist[0]=1;
	que.push_back(0);	
	while (!que.empty()) 
	{
		int node = que.front();
		que.pop_front();
		
		if (node == n-1)
			break;

		for (int i = 0; i < n; ++i) 
		{
			if (flow[node][i] == 0)
				continue;

			if (dist[i] == 0) 
			{
				que.push_back(i);
				dist[i] = dist[node]+1;
				edges[node][++edges[node][0]] = i;
			} else if (dist[i] == dist[node]+1) 
			{
				edges[node][++edges[node][0]] = i;
			}
		}
	}
	ok[0]=1;
	now=do_df(0,n-1);
	sol+=now;
	}
printf("%d",sol);

return 0;

}