Cod sursa(job #288616)

Utilizator IeewIordache Bogdan Ieew Data 25 martie 2009 22:53:56
Problema Flux Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream.h>
#define MAXN 1001

int a[MAXN][MAXN],n,m,c[MAXN][MAXN];
struct coada
{ int t,nod;};
coada q[MAXN+20];
int min(int a,int b)
{ return a<b?a:b;}

/*void rec(int x)
{
 if(q[x].t)rec(q[x].t);
 cout<<q[x].nod<<' ';
}*/

int main()
{int i,x,y,k,ok,p,u,viz[MAXN],minim,z;
//clrscr();
ifstream in("maxflow.in");
in>>n>>m;
for(i=1;i<=m;i++){in>>x>>y>>z;c[x][y]=z;}

in.close();
ok=1;
while(ok)
	{
	 for(i=1;i<=n;i++)viz[i]=0;
	 viz[1]=1;

	 u=p=1;
	 q[1].t=0;
	 q[1].nod=1;
	 for(p=1;p<=u&&!viz[n];p++)
		{
		 x=q[p].nod;
		 for(i=1;i<=n;i++)
			if(c[x][i]&&!viz[i]&&a[x][i]<c[x][i])
				{
				 q[++u].nod=i;
				 q[u].t=p;
				 viz[i]=1;
				}
				else
			if(c[i][x]&&!viz[i]&&a[i][x]>0)
				{
				 q[++u].nod=i;
				 q[u].t=p;
				 viz[i]=1;
				}
		}
	 if(!viz[n])break;

	 x=u;
//	 cout<<"drum \n";
//	 rec(u);

	 minim=32000;
	 while(q[x].t)
		{
		 k=q[q[x].t].nod;
		 y=q[x].nod;
		 if(c[k][y])minim=min(minim,c[k][y]-a[k][y]);
			else minim=min(minim,a[y][k]);
		 x=q[x].t;
		}
//	cout<<'\n'<<"minim :"<<minim<<'\n'<<'\n';
	x=u;
	while(q[x].t)
		{
		 k=q[q[x].t].nod;
		 y=q[x].nod;

		 if(c[k][y])a[k][y]+=minim;
			else a[y][k]-=minim;
		 x=q[x].t;
		}
	}
unsigned long sol=0;
ofstream out("maxflow.out");
for(i=1;i<=n;i++)sol+=a[i][n];
out<<sol<<'\n';
out.close();
return 0;
}