Pagini recente » Cod sursa (job #398627) | Cod sursa (job #1055800) | Cod sursa (job #59672) | Cod sursa (job #1743103) | Cod sursa (job #2520433)
#include <bits/stdc++.h>
#define Nod first
#define Lev second
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n,m;
int vf[5001],urm[5001],last[1001],nr;
int cap[5001],flow[5001];
int level[1001];
int muchie[5001],t;
bitset <1001> pass,viz;
int sum=0;
void adauga(int nod,int vec,int cp)
{
vf[++nr]=vec;
urm[nr]=last[nod];
last[nod]=nr;
cap[nr]=cp;
}
queue <int> c;
bool bfsLv()
{
for(int i=1;i<=n;i++)
viz[i]=0;
c.push(1);
level[1]=0;
viz[1]=1;
while(!c.empty())
{
int nod=c.front();
c.pop();
for(int k=last[nod];k;k=urm[k])
if(!viz[ vf[k] ] && cap[k]-flow[k]>0)
{
level[ vf[k] ]=level[nod]+1;
viz[ vf[k] ]=1;
pass[ vf[k] ]=1;
c.push(vf[k]);
}
}
return viz[n];
}
bool dfs(int nod=1,int poz=1)
{
bool found=0;
if(nod==n)
{
t=poz-1;
return true;
}
for(int k=last[nod];k && !found;k=urm[k])
if(pass[ vf[k] ]==1 && level[nod]+1==level[ vf[k] ] && cap[k]-flow[k]>0)
{
muchie[poz]=k;
found=dfs(vf[k],poz+1);
}
if(!found)
pass[nod]=0;
return found;
}
int main()
{
in>>n>>m;
for(int i,j,cp,k=1;k<=m;k++)
{
in>>i>>j>>cp;
adauga(i,j,cp);
}
while(bfsLv()==true)
{
while(dfs()==true)
{
int minim=cap[ muchie[1] ]-flow[ muchie[1] ];
for(int i=2;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;
}