Pagini recente » Cod sursa (job #1279981) | Cod sursa (job #170685) | Cod sursa (job #2542653) | Cod sursa (job #1725281) | Cod sursa (job #2520646)
#include <bits/stdc++.h>
#define Inf 1000000000
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n,m;
int vf[5001],urm[5001],last[5001],nrG;
int cap[5001],flow[5001];
int level[1001];
bitset <1001> viz,use;
int muchie[1001],drum[1001],t;
int sum;
void adauga(int nod,int vec,int capM)
{
vf[++nrG]=vec;
urm[nrG]=last[nod];
last[nod]=nrG;
cap[nrG]=capM;
}
bool bfs()
{
for(int i=1;i<=n;i++)
viz[i]=0,use[i]=0;
queue <int> c;
c.push(1);
viz[1]=1;use[1]=1;
level[1]=0;
while(!c.empty())
{
int nod=c.front();
c.pop();
for(int k=last[nod];k;k=urm[k])
if(viz[ vf[k] ]==0 && cap[k]-flow[k]>0)
{
viz[ vf[k] ]=1;use[ vf[k] ]=1;
level[ vf[k] ]=level[nod]+1;
c.push(vf[k]);
}
}
return viz[n];
}
bool dfs(int nod=1,int pas=1)
{
if(nod==n)
{
t=pas-1;
return 1;
}
bool found=0;
for(int k=last[nod];k && !found;k=urm[k])
if(use[ vf[k] ] && level[ vf[k] ]==level[nod]+1 && cap[k]-flow[k]>0)
{
muchie[pas]=k;
drum[pas]=vf[k];
found=dfs(vf[k],pas+1);
}
if(!found)
use[nod]=0;
return found;
}
int main()
{
in>>n>>m;
for(int i,j,capM,k=1;k<=m;k++)
{
in>>i>>j>>capM;
adauga(i,j,capM);
}
while(bfs()==true)
{
while(dfs()==true)
{
int minim=Inf;
for(int i=1;i<=t;i++)
minim=min(minim,cap[ muchie[i] ]-flow[ muchie[i] ]);
for(int i=1;i<=t;i++)
flow[ muchie[i] ]+=minim;
sum+=minim;
}
}
out<<sum;
return 0;
}