Cod sursa(job #469093)

Utilizator alisssiaMititelu Andra alisssia Data 6 iulie 2010 11:57:21
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
using namespace std;
#include<cstdio>
#define nmax 1001
struct nod { int v; nod *next;};
nod *a[nmax];
int f[nmax][nmax],t[nmax],n,m,c[nmax][nmax];

void add(int x, int y, int z)
{
	nod *p=new nod;
	p->v=y;
	c[x][y]=z;
	p->next=a[x];
	a[x]=p;
}

void read()
{
	int i,x,z,y;
	freopen("maxflow.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
	}
}

int bfs()
{
	int q=1,p=1,Q[nmax],viz[nmax],i,x;
	Q[1]=1;
	viz[1]=1; t[1]=0;
	for(i=2;i<=n;i++) {viz[i]=0; t[i]=0;}
	while(p<=q)
	{
		x=Q[p]; p++;
		for(nod *u=a[x];u;u=u->next)
			if(!viz[u->v] && f[x][u->v]<c[x][u->v])
			{
				Q[++q]=u->v;
				viz[u->v]=1;
				t[u->v]=x;
			}
	}
	if(viz[n]) return 1;
	else return 0;
}

int minim(int a, int b) { if(a>b) return b; return a;}

int main()
{
	int i,j,min,flux=0;
	read();
	while(bfs())
	{ //for(i=1;i<=n;i++) printf("%d ",t[i]);
		for(i=2;i<n;i++)
		{
			min=c[i][n]-f[i][n];
			for(j=i;t[j];j=t[j])
				min=minim(min, c[t[j]][j]-f[t[j]][j]);
			//printf("\n%d",min);
			if(min>0)
			{
				for(j=i;t[j];j=t[j])
				{
					f[t[j]][j]+=min;
					f[j][t[j]]-=min;
				}
				f[i][n]+=min;
				f[n][i]-=min;
			}
		}}
	for(nod *u=a[1];u;u=u->next)
		flux+=f[1][u->v];
	freopen("maxflow.out","w",stdout);
	printf("%d\n",flux);
	return 0;
}