Cod sursa(job #275698)

Utilizator mili92Militaru Andrei mili92 Data 10 martie 2009 16:57:19
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#include<string.h>
#define MAXN 1001
#define INF 110000
int n,m,s,d,flux,c[MAXN][MAXN],f[MAXN][MAXN],t[MAXN];
int min(int a, int b)
{
if(a>b)
  return b;
return a;
}
int bfs(int s, int d)
{
int p,u,nod,i,q[MAXN];
memset(t,0,sizeof(t));
p=0; u=0; q[p]=s; t[s]=-1;
while(p<=u)
   {
     nod=q[p];
     for(i=1;i<=n;++i)
	if(!t[i] && c[nod][i]-f[nod][i]>0)
	   {
	      q[++u]=i;
	      t[i]=nod;
	      if(i==d)
		 return 1;
	   }
     ++p;
   }
return 0;
}
void flux_max()
{
int i,cr;
for(flux=0;bfs(s,d);flux+=cr)
   {
     cr=INF;
     i=d;
     while(i!=s)
       {
	  cr=min(cr,c[t[i]][i]-f[t[i]][i]);
	  i=t[i];
       }
     i=d;
     while(i!=s)
       {
	 f[t[i]][i]+=cr;
	 f[i][t[i]]-=cr;
	 i=t[i];
       }
   }
}
int main()
{
int i,j,z,x,y;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
s=1; d=n;
for(i=1;i<=m;++i)
  {
     scanf("%d%d%d",&x,&y,&z);
     c[x][y]=z;
  }
flux_max();
printf("%d\n",flux);

return 0;
}