Pagini recente » Cod sursa (job #2144903) | Cod sursa (job #443002) | Cod sursa (job #857096) | Cod sursa (job #585157) | Cod sursa (job #2524623)
#include <bits/stdc++.h>
#define Inf (int)(1<<30)
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n,m;
int vf[5001],urm[5001],last[5001],nr;
int cap[1001][1001],flow[1001][1001];
bitset <1001> viz;
int tata[1001];
int drum[1001];
int sum;
void adauga(int nod,int vec)
{
vf[++nr]=vec;
urm[nr]=last[nod];
last[nod]=nr;
}
bool bfs()
{
queue <int> c;
for(int i=1;i<=n;i++)
viz[i]=0;
viz[1]=1;
c.push(1);
while(!c.empty() && !viz[n])
{
int nod=c.front();
c.pop();
for(int k=last[nod];k;k=urm[k])
if(!viz[ vf[k] ] && cap[nod][ vf[k] ]-flow[nod][ vf[k] ]>0)
{
viz[ vf[k] ]=1;
tata[ vf[k] ]=nod;
c.push(vf[k]);
}
}
return viz[n];
}
int main()
{
in>>n>>m;
for(int i,j,cp,k=1;k<=m;k++)
{
in>>i>>j>>cp;
adauga(i,j);
cap[i][j]=cp;
}
while(bfs()==true)
{
int minim=Inf;
int t=0,poz=n;
while(poz)
{
drum[++t]=poz;
poz=tata[poz];
}
for(int i=1;i<t;i++)
minim=min(minim,cap[ drum[i+1] ][ drum[i] ]-flow[ drum[i+1] ][ drum[i] ]);
for(int i=1;i<t;i++)
flow[ drum[i+1] ][ drum[i] ]+=minim;
sum+=minim;
}
out<<sum;
return 0;
}