Cod sursa(job #990431)

Utilizator andreiiiiPopa Andrei andreiiii Data 28 august 2013 12:05:57
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#define N 1002
#define INF 1<<30
using namespace std;

//FILE *fin=fopen("maxflow.in", "r"), *fout=fopen("maxflow.out", "w");
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

struct nod
{
	int n;
	nod *next;
} *a[N];
int C[N][N], F[N][N], Tr[N], v[N];
int cd[N];
int n, m;

void gadd(int x, int y)
{
	nod *p=new nod;
	p->n=y;
	p->next=a[x];
	a[x]=p;
}

int BFS()
{
	int i, nods;
	nod *p;
	memset(v, 0, sizeof(v));
	cd[0]=1;
	cd[1]=1;
	v[1]=1;
	for(i=1;i<=cd[0];i++)
	{
		nods=cd[i];
		if(nods==n) continue;
		for(p=a[nods];p;p=p->next)
		{
			if(C[nods][p->n]==F[nods][p->n]||v[p->n]) continue;
			v[p->n]=1;
			Tr[p->n]=nods;
			cd[++cd[0]]=p->n;
		}
	}
	return v[n];
}

int main()
{
	int flow, i, x, y, fmin;
	nod *p;
	fin>>n>>m;
	for(i=1;i<=m;i++)
	{
		fin>>x>>y;
		fin>>C[x][y];
		gadd(x, y);
		gadd(y, x);
	}
	for(flow=0;BFS();)
	{
		for(p=a[n];p;p=p->next)
		{
			if(C[p->n][n]==F[p->n][n]||!v[p->n]) continue;
			Tr[n]=p->n;
			fmin=INF;
			for(i=n;i!=1;i=Tr[i])
			{
				fmin=min(fmin, C[Tr[i]][i]-F[Tr[i]][i]);
			}
			if(fmin==0) continue;
			for(i=n;i!=1;i=Tr[i])
			{
				F[i][Tr[i]]-=fmin;
				F[Tr[i]][i]+=fmin;
			}
			flow+=fmin;
		}
	}
	fout<<flow;
}