Pagini recente » Diferente pentru preoni-2006/runda-4/solutii intre reviziile 16 si 27 | Cod sursa (job #1907621) | Istoria paginii grigore-moisil-2009/clasament/11-12 | Profil NoDaniel | Cod sursa (job #796064)
Cod sursa(job #796064)
#include <stdio.h>
#include <bitset>
#include <vector>
#define NMAX 1005
#define INF 1000000000
#define pb push_back
using namespace std;
int n,m,S,D,C[NMAX][NMAX],F[NMAX][NMAX],Q[NMAX],ant[NMAX],rez;
bitset <NMAX> viz;
vector <int> A[NMAX];
void read()
{
scanf("%d%d",&n,&m);
int i,x,y,z;
for (i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&z);
A[x].pb(y); A[y].pb(x);
C[x][y]=z;
}
S=1; D=n;
}
int flow()
{
Q[0]=1; Q[++Q[0]]=S;
viz.reset(); viz[S]=1;
int i,j,nod,vec;
for (i=1; i<=Q[0]; i++)
{
nod=Q[i];
if (nod==n)
continue ;
for (j=0; j<A[nod].size(); j++)
{
vec=A[nod][j];
if (!viz[vec] && C[nod][vec]-F[nod][vec]>0)
{
Q[++Q[0]]=vec; viz[vec]=1;
ant[vec]=nod;
}
}
}
return viz[D];
}
inline int min(int x,int y)
{
return x<y ? x : y;
}
void solve()
{
int i,nod,vec_dest,fmin;
while (flow())
{
for (i=0; i<A[D].size(); i++)
{
vec_dest=A[D][i];
if (viz[vec_dest] && C[vec_dest][D]-F[vec_dest][D]>0)
{
ant[D]=vec_dest;
fmin=INF;
for (nod=D; nod!=S; nod=ant[nod])
fmin=min(fmin,C[ant[nod]][nod]-F[ant[nod]][nod]);
for (nod=D; nod!=S; nod=ant[nod])
{
F[ant[nod]][nod]+=fmin;
F[nod][ant[nod]]-=fmin;
}
rez+=fmin;
}
}
}
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
read();
solve();
printf("%d\n",rez);
return 0;
}