Cod sursa(job #75014)

Utilizator megabyteBarsan Paul megabyte Data 30 iulie 2007 13:23:35
Problema Flux Scor 24
Compilator cpp Status done
Runda Summer Challenge 2007, Runda 1 Marime 1.5 kb
#include <cstdio>
#include <vector>
#include <iostream>
#define INF "flux.in"
#define OUF "flux.out"
#define NMAX 128
#define pb push_back
#define MIN(a,b) ((a<b)?(a):(b))
#define BIG 100000000
#define EPS 1e-3

using namespace std;

double c[NMAX][NMAX]={0},f[NMAX][NMAX]={0};
int t[NMAX],n,m,s,d;
vector<int> vi[NMAX];
void HA_HA_HA()
{
	double CRAP;
	int flux,aux=1;
	CRAP=aux;
}
double bfs()
{
//	cout<<"BF"<<endl;
	int p,q,i,u,v;
	vector<int> que;
	double cp[NMAX];
	que.pb(s);
	p=0;q=1;
	for(i=1;i<=n;++i) t[i]=0;
	t[s]=-1;cp[s]=BIG;
	while(p<q)
	{
		u=que[p]; ++p;
//		cout<<"U: "<<u<<endl;
		for(i=0;i<vi[u].size();++i)
		{
			v=vi[u][i];
//			cout<<v<<' '<<c[u][v]<<' '<<f[u][v]<<endl;
			if(c[u][v]-f[u][v]>EPS&&t[v]==0)
			{
				t[v]=u;
				cp[v]=MIN(cp[u],c[u][v]-f[u][v]);
				if(v!=d) { que.pb(v);++q;}
				else
				return cp[d];//se gaseste flux
			}
		}
//		cout<<endl;
	}
	return 0;//nu se gaseste flux
}		

double flux()
{
	int ok,u,v;
	double trans,fluxx=0;
	do
	{
		ok=1;
		trans=bfs();
//		cout<<trans<<endl;

		if(trans<1) ok=0;
		fluxx+=trans;
		if(ok)
		{
			v=d;
			while(v!=s)
			{
				u=t[v];
				f[u][v]+=trans;
				f[v][u]-=trans;
				v=u;
			}
		}
	}while(ok);
	return fluxx;
}

int main()
{
	int i,a,b;
	double cost;
	FILE *in,*out;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
	fscanf(in,"%d%d",&n,&m);
	for(i=1;i<=m;++i)
	{
		fscanf(in,"%d%d%lf",&a,&b,&cost);
		vi[a].pb(b);
		vi[b].pb(a);
		c[a][b]+=cost;
		c[b][a]+=cost;
	}
	s=1;d=n;
	fprintf(out,"%.3lf\n",flux());
	fclose(in);fclose(out);
	return 0;
}