Cod sursa(job #574517)

Utilizator marius21Petcu Marius marius21 Data 7 aprilie 2011 11:36:24
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <cstdlib>
#include <list>
#include <cstring>
#include <utility>

using namespace std;

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

int n,m;

int c[1024][1024];
int f[1024][1024];
int t[1024];
int mm[1024];

list<int> ad[1024];
#define INF 0x3f3f3f3f

int bfs()
{
	memset(t, 0xFF, sizeof(int)*n); //fill with -1
	t[0]=-2;
	mm[0]=INF;
	list<int> queue;
	queue.push_back(0);
	while (!queue.empty())
	{
		int nr = queue.back();
		queue.pop_back();
		for (list<int>::iterator i = ad[nr].begin(); i!=ad[nr].end(); i++)
		{
			if (t[*i]!=-1) continue;
			int rezidual = c[nr][*i]-f[nr][*i];
			if (rezidual<=0) continue;
			mm[*i]=min<int>(rezidual,mm[nr]);
			queue.push_back(*i);
			t[*i]=nr;
			if (*i==n-1) break;
		}
		if (t[n-1]!=-1) break;
	}
	if (t[n-1]==-1)
		return 0;
	return mm[n-1];
}

int flow()
{
	int mx;
	int flw = 0;
	while (1)
	{
		mx = bfs();
		if (!mx)
			break;
		int x = n-1;
		while (t[x]>=0)
		{
			f[t[x]][x]+=mx;
			x = t[x];
		}
		flw+=mx;
	};
	return flw;
}

int main (int argc, char * const argv[]) {
	fscanf(fin, "%d%d",&n,&m);
	for (int i=0; i<m; i++)
	{
		int x,y,cs;
		fscanf(fin, "%d%d%d",&x,&y,&cs);
		x--; y--;
		f[x][y]=f[y][x]=0;
		c[x][y]=cs;
		c[y][x]=0;
		ad[x].push_back(y);
		ad[y].push_back(x);
	}
	fprintf(fout,"%d\n",flow());
	fclose(fin);
	fclose(fout);
    return 0;
}