Cod sursa(job #301085)

Utilizator socheoSorodoc Ionut socheo Data 7 aprilie 2009 22:00:00
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
vector<int>l[1001];
int c[1001][1001],t[1001],viz[1001];
int q[1001],rez,flm,n,m;
int bf()
{ int i;
	int st=1,sf=2;
 q[1]=1; 
 viz[1]=1;
 while(st<sf)
 { int x=q[st];
	for(i=0;i<l[x].size();i++)
    if(c[x][l[x][i]]&&viz[l[x][i]]==0)
	  { viz[l[x][i]]=1;
        t[l[x][i]]=x;
         q[sf++]=l[x][i];
        if(l[x][i]==n)
           return 1;
	  }
	  st++;
 }	  
return 0;	
}
int main()
{ freopen("maxflow.in","r",stdin);
  freopen("maxflow.out","w",stdout);
  scanf("%d%d",&n,&m);
  
  for(int i=1;i<=m;i++)
  { int q,w,e;
	  scanf("%d%d%d",&q,&w,&e);
	  l[q].push_back(w);
	  l[w].push_back(q);
	  c[q][w]+=e;
  }
while(bf())
{
for(int r=0;r<l[n].size();r++)
  if(viz[l[n][r]]==1&&c[l[n][r]][n])
  {
  flm=1000000;
  int j;
  for(j=n;j!=1;j=t[j])
    if(flm>c[t[j]][j])
	   flm=c[t[j]][j];
   rez+=flm;
     for(j=n;j!=1;j=t[j])
	  { c[t[j]][j]-=flm;
	    c[j][t[j]]+=flm;
	  }
}
for(int u=1;u<=n;u++)
	viz[u]=q[u]=0;
}
printf("%d\n",rez);	
	return 0;
}