Cod sursa(job #386885)

Utilizator loginLogin Iustin Anca login Data 26 ianuarie 2010 11:56:28
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
# include <fstream>
# include <iostream>
using namespace std;
int c[1003][1003], n, t[1003], fmax, v[1003], nv;

void read ()
{
	int m;
	ifstream fin ("maxflow.in");
	fin>>n>>m;
	for (;m;--m)
	{
		int x, y, co;
		fin>>x>>y>>co;
		c[x][y]=co;
		if (y==n)
			v[++nv]=x;
	}
}

struct nod {
	int info;
	nod *next;};

void bfs (int s, int d)
{
	nod *st, *dr, *q;
	int k;
	for (int i=1;i<=n;i++)
		t[i]=-1;
	st=dr=new nod;
	st->next=NULL;
	st->info=s;
	t[s]=0;
	while (st)
	{
		k=st->info;
		if(k==n)
		    return;
		for (int i=2;i<=n;i++)
			if (c[k][i]>0 && t[i]==-1)
			{
				t[i]=k;
				q=new nod;
				q->next=NULL;
				q->info=i;
				dr->next=q;
				dr=q;
			}
		q=st;
		st=st->next;
		delete q;
	}

}				

void EK ()
{
	int cmin, gata=0;
	while (!gata)
	{
		gata=1;
		bfs(1,n);
		for (int j=1;j<=nv;j++)
			if (c[v[j]][n]>0 &&t[v[j]]!=-1)
			{
				t[n]=v[j];
				cmin=1000000000;
				for (int i=n;t[i];i=t[i])
					if (cmin>c[t[i]][i])
						cmin=c[t[i]][i];
				if (cmin!=1000000000)
				{
					gata=0;
					for (int i=n;t[i];i=t[i])
					{
						c[t[i]][i]-=cmin;
						c[i][t[i]]+=cmin;
					}
					fmax+=cmin;
				}
			}
	}
}
		

int main ()
{
	read ();
	EK();	
	ofstream fout ("maxflow.out");
	fout<<fmax;
	return 0;
}