Pagini recente » Cod sursa (job #839436) | Cod sursa (job #241321)
Cod sursa(job #241321)
using namespace std;
#include <vector>
#include <bitset>
#define pb push_back
#define sz size
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define CC(v) memset((v),0,sizeof((v)))
#define IN "maxflow.in"
#define OUT "maxflow.out"
#define N_MAX 1<<10
int rez,N,M;
int T[N_MAX],C[N_MAX][N_MAX];
vector< vector<int> > A(N_MAX);
bool viz[N_MAX];
void scan()
{
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d%d",&N,&M);
int x,y,cc;
FOR(i,1,M)
{
scanf("%d%d%d\n",&x,&y,&cc);
A[x].pb(y);
A[y].pb(x);
C[x][y] = cc;
}
}
void BF()
{
CC(viz);
CC(T);
viz[1] = true;
vector<int> Q;
Q.pb(1);
for(int i=0;i<(int)Q.sz();++i)
{
int nod = Q[i];
int l = A[nod].sz()-1;
FOR(j,0,l)
{
int fiu = A[nod][j];
if(!viz[fiu] && C[nod][fiu])
{
T[fiu] = nod;
viz[fiu] = true;
Q.pb(fiu);
}
}
}
}
bool flux()
{
int flux(0);
if(!T[N])
return false;
int i = T[N];
//FOR(i,T[N],T[N])
{
// if(!C[i][N] || !viz[i])
// continue;
int aux(C[i][N]);
for(int nod = i;T[nod];aux = min(aux,C[T[nod]][nod]),nod = T[nod]);
// if(!aux)
// continue;
C[i][N] -= aux;
C[N][i] += aux;
for(int nod = i;T[nod];C[T[nod]][nod] -= aux,C[nod][T[nod]] += aux,nod = T[nod]);
flux += aux;
}
rez += flux;
return true;
}
void solve()
{
for(BF();flux();BF());
printf("%d\n",rez);
}
int main()
{
scan();
solve();
return 0;
}