Cod sursa(job #583807)

Utilizator crushackPopescu Silviu crushack Data 22 aprilie 2011 18:25:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define NMax 1010
#define INF 0x3f3f3f3f
using namespace std;

const char IN[]="maxflow.in",OUT[]="maxflow.out";

int N,M,Rez;
int C[NMax][NMax];
int F[NMax][NMax];
int p[NMax];
bool visit[NMax];
vector<int> ad[NMax];

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

int bfs()
{
	int x;
	queue<int> qu;
	
	memset(visit,0,sizeof(visit));
	memset(p,0,sizeof(p));
	qu.push(0);
	p[0]=-1;
	visit[0]=true;
	
	while (!qu.empty())
	{
		x=qu.front();
		qu.pop();
		
		for (vector<int>::iterator it=ad[x].begin();it<ad[x].end();++it)
			if (!visit[*it] && F[x][*it]!=C[x][*it])
			{
				visit[*it]=true;
				p[*it]=x;
				qu.push(*it);
			}
	}
	return visit[N-1];
}

int main()
{
	int i,x,y,c,v,m;
	freopen(IN,"r",stdin);
	scanf("%d%d",&N,&M);
	for (i=0;i<M;++i)
	{
		scanf("%d%d%d",&x,&y,&c);
		ad[x-1].push_back(y-1);
		ad[y-1].push_back(x-1);
		C[x-1][y-1]=c;
	}
	
	while (bfs())
		for (vector<int>::iterator it=ad[N-1].begin();it<ad[N-1].end();++it) if (visit[*it] && F[*it][N-1] !=C[*it][N-1])
		{
			v=*it;
			m=C[*it][N-1]-F[*it][N-1];
			
			for (;v!=0;v=p[v])
				m= min(m,C[p[v]][v]-F[p[v]][v]);
			
			if (m==0) continue;
			
			F[*it][N-1]+=m;
			F[N-1][*it]-=m;
			for (v=*it;v!=0;v=p[v])
				F[p[v]][v]+=m,
				F[v][p[v]]-=m;
			Rez+=m;
		}
	
	freopen(OUT,"w",stdout);
	printf("%d\n",Rez);
	fclose(stdout);
	return 0;
}