Cod sursa(job #241207)

Utilizator brokensocialiconGrigoriu Cristian-Andrei brokensocialicon Data 9 ianuarie 2009 16:51:41
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <algorithm>
#include <cstdio>
#include <string>

using namespace std;

#define n_max 1005

int mat[n_max][n_max];
struct nod { int x; nod *n;};

nod *a[n_max];
int n, m;
int t[n_max];

int latime()
{
	int cd[n_max], p=0, q=0;
	bool k[n_max];
	int d[n_max];

	memset(k, 0, sizeof(k));
	memset(t, 0, sizeof(t));
	memset(d, 0, sizeof(d));

	k[1]=true;
	cd[0]=1;

	while(p<=q)
	{
		int u=cd[p++];

		for(nod *i=a[u]; i; i=i->n)
			if(!k[i->x])
				if(mat[u][i->x] > 0)
				{
					cd[++q]=i->x;
					k[i->x]=true;
					t[i->x]=u;
					d[i->x]=d[u] + 1;
				}
	}

	if(t[n] == 0) return 0;
	return 1;
}

int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d %d\n", &n, &m);

	for (int i=m; i>0; i--)
	{
		int p,q,c;
		scanf("%d %d %d\n", &p, &q,&c);
		nod *t=new nod;
		t->x=q;
		t->n=a[p];
		a[p]=t;
		t=new nod;
		t->x=p;
		t->n=a[q];
		a[q]=t;
		mat[p][q]=c;
	}

	int debit=0;

	while(latime())
	{
		for(nod *i=a[n]; i; i=i->n)
			if(t[i->x])
			{
				int minim=5000;
				for(int j=i->x; t[j]; j=t[j])
					minim=min(minim, mat[t[j]][j]);
				minim=min(minim, mat[i->x][n]);
				if(minim <= 0)
				   continue;

				mat[i->x][n]-=minim;
				mat[n][i->x]+=minim;

				for(int j=i->x; t[j]; j=t[j])
				{
					mat[t[j]][j]-=minim;
					mat[j][t[j]]+=minim;
				}
				debit+=minim;
			}

	}

	printf("%d\n", debit);

	return 0;
}