Pagini recente » Cod sursa (job #1089257) | Cod sursa (job #2980663) | Cod sursa (job #685147) | Cod sursa (job #2774261) | Cod sursa (job #2525050)
#include <bits/stdc++.h>
#define Inf 2000000001
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n,m,c,sum;
int vf[10001],urm[10001],last[1001],nr;
int cap[1001][1001],flow[1001][1001];
bitset <1001> viz;
void adauga(int nod,int vec)
{
vf[++nr]=vec;
urm[nr]=last[nod];
last[nod]=nr;
}
int dfs(int nod=1,int minFlow=Inf)
{
int found=0;
viz[nod]=1;
if(nod==n)
{
sum+=minFlow;
viz[nod]=0;
return minFlow;
}
for(int k=last[nod];k && !found;k=urm[k])
if(!viz[ vf[k] ])
{
if(cap[ nod ][ vf[k] ]-flow[ nod ][ vf[k] ]>=c)
{
found=dfs(vf[k], min(minFlow,cap[ nod ][ vf[k] ]-flow[ nod ][ vf[k] ]) );
flow[ nod ][ vf[k] ]+=found;
}
else if(flow[ vf[k] ][ nod ]>=c)
{
found=dfs(vf[k], min(minFlow,flow[ vf[k] ][ nod ]) );
flow[ vf[k] ][ nod ]-=found;
}
}
viz[nod]=0;
return found;
}
int main()
{
in>>n>>m;
for(int i,j,ct,k=1;k<=m;k++)
{
in>>i>>j>>ct;
cap[i][j]=ct;
adauga(i,j);
adauga(j,i);
c=max(c,ct);
}
for(;c;c/=2)
while(dfs());
out<<sum;
return 0;
}