Cod sursa(job #695567)

Utilizator gabriel93Robu Gabriel gabriel93 Data 28 februarie 2012 13:07:04
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<stdio.h>
#include<cstring>
#include<cstdlib>
using namespace std;
FILE *f,*g;
int n,m,flux[1002][1002];

struct nod
{
	int v,c;
	nod *adresa;
};
nod *a[1002];

void adaug(int x,int y,int c)
{
	nod *p;
	p=new nod;
	p->v=y;
	p->c=c;
	p->adresa=a[x];
	a[x]=p;
	
	p=new nod;
	p->v=-x;
	p->c=c;
	p->adresa=a[y];
	a[y]=p;
}
struct coada
{
	int t,f;
};
coada cd[1002];


int main()
{
	nod *q;
	int i,x,y,c,p,u,viz[1002],min,s,ok;
	f=fopen("maxflow.in","rt");
	fscanf(f,"%d %d",&n,&m);
	for(i=1;i<=n;i++)
		a[i]=0;
	for(i=1;i<=n;i++)
	{
		fscanf(f,"%d %d %d",&x,&y,&c);
		adaug(x,y,c);
	}
	fclose(f);
	ok=1;
	while(ok)
	{
	cd[1].t=0;
	cd[1].f=1;
	p=1; u=1;
	memset(viz,0,sizeof(viz));
	viz[1]=1;
	min=10000000; 
	while(p<=u && viz[n]==0)
	{
		for(q=a[abs(cd[p].f)];q!=0 && viz[n]==0;q=q->adresa)
			if(q->v >0 && viz[q->v]==0 && q->c - flux[abs(cd[p].f)][q->v] >0)
			{
				u++;
				cd[u].t=p;
				cd[u].f=q->v;
				viz[q->v]=1;
				flux[abs(cd[p].f)][q->v]=q->c;
			}
			else
				if(q->v <0 && viz[-q->v]==0 && flux[abs(cd[p].f)][-q->v] >0)
				{
					u++;
					cd[u].t=p;
					cd[u].f=q->v;
					viz[-q->v]=1;
					flux[abs(cd[p].f)][-q->v]=flux[abs(cd[p].f)][-q->v];
				}
		p++;
	}
	ok=viz[n];
	if(ok==1)
	{
		for(i=u;i!=0;i=abs(cd[i].t))
			if(flux[abs(cd[cd[i].t].f)][cd[i].f] <min)
				min=flux[abs(cd[cd[i].t].f)][cd[i].f];
		for(i=u;i!=0;i=abs(cd[i].t))
			if(cd[i].f>0)
				flux[abs(cd[cd[i].t].f)][cd[i].f]+=min;
			else
				flux[abs(cd[cd[i].t].f)][-cd[i].f]-=min;
	}
	}
	s=0;
	for(i=1;i<=n;i++)
		s=s+flux[1][i];
	g=fopen("maxflow.out","wt");
	fprintf(g,"%d",s);
	fclose(g);
	return 0;
}