Pagini recente » Cod sursa (job #2362359) | Cod sursa (job #2753264) | Cod sursa (job #1450575) | Cod sursa (job #2097361) | Cod sursa (job #742857)
Cod sursa(job #742857)
#include <cstdio>
#include <cstring>
#include <vector>
#define NMAX 1005
#define INF 1000000000
#define pb push_back
using namespace std;
int n,m,C[NMAX][NMAX],F[NMAX][NMAX],dad[NMAX],Q[NMAX],fmin,flow;
vector <int> A[NMAX];
char viz[NMAX];
void read()
{
scanf("%d%d",&n,&m);
int i,a,b,c;
for (i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
A[a].pb(b); A[b].pb(a); C[a][b]=c;
}
}
inline int min(int x,int y)
{
return x<y ? x : y;
}
int BF()
{
memset(viz,0,sizeof(viz));
Q[0]=1; Q[1]=1; viz[1]=1;
int i,j,nod,vec;
for (i=1; i<=Q[0]; i++)
{
nod=Q[i];
for (j=0; j<A[nod].size(); j++)
{
vec=A[nod][j];
if (F[nod][vec]==C[nod][vec] || viz[vec])
continue ;
Q[++Q[0]]=vec; viz[vec]=1; dad[vec]=nod;
}
}
return viz[n];
}
void flux()
{
int i,nod;
while (BF())
{
for (i=0; i<A[n].size(); i++)
{
nod=A[n][i];
if (C[nod][n]==F[nod][n] || !viz[nod])
continue ;
dad[n]=nod;
fmin=INF;
for (nod=n; nod!=1; nod=dad[nod])
fmin=min(fmin,C[dad[nod]][nod]-F[dad[nod]][nod]);
for (nod=n; nod!=1; nod=dad[nod])
{
F[dad[nod]][nod]+=fmin;
F[nod][dad[nod]]-=fmin;
}
flow+=fmin;
}
}
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
read();
flux();
printf("%d\n",flow);
return 0;
}