Cod sursa(job #1061406)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 19 decembrie 2013 18:43:04
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int MAXN=1005;
const int INF=(1<<30)-1;
int n,m,lg,MAX_FLOW;
int mark[MAXN],capacity[MAXN][MAXN],flow[MAXN][MAXN];
vector<int> g[MAXN];
queue<int> q;
int l[MAXN];
void read()
{
	int x,y,c;
	freopen("maxflow.in","r",stdin);
	scanf("%d%d",&n,&m);
	for (int i=1; i<=m; ++i)
	{
		scanf("%d%d%d",&x,&y,&c);
		g[x].push_back(y);
		capacity[x][y]=c;
	}
}
void write()
{
	freopen("maxflow.out","w",stdout);
	printf("%d\n",MAX_FLOW);
}
void create_link()
{
	lg=0;
	int u=1,v=0,i=0;
	if (mark[n])
		v=n;
	while (v)
	{
		++lg;
		v=mark[v];
	}
	for (i=lg, v=n; i>=1 && v!=0; v=mark[v], --i)
	{
		l[i]=v;
	}
}
void increment_flow()
{
	int i=0,inc=INF;

	for (i=1; i<lg; ++i)
		inc=min(inc,capacity[l[i]][l[i+1]]-flow[l[i]][l[i+1]]);

	if (inc==INF)
		return;

	for (i=1; i<=lg; ++i)
		flow[l[i]][l[i+1]]+=inc;

	MAX_FLOW+=inc;

	for (i=1; l[i]!=0; l[i]=0, ++i);
}
void bfs()
{
	for (int i=1; i<=n; mark[i]=0, ++i);

	int u=0;
	q.push(1);
	while (!q.empty())
	{
		u=q.front();
		q.pop();
		for (vector<int>::iterator v=g[u].begin(); v!=g[u].end(); ++v)
		{
			if (!mark[*v] && flow[u][*v]<capacity[u][*v])
			{
				mark[*v]=u;
				q.push(*v);
			}
		}
	}
}
void ek()
{
	do
	{
		bfs();
		create_link();
		increment_flow();
	}
	while (mark[n]);
}

int main()
{
	read();
	ek();
	write();
	return 0;
}