Pagini recente » Cod sursa (job #3182548) | Cod sursa (job #1279373) | Cod sursa (job #2936780) | Cod sursa (job #2081271) | Cod sursa (job #293342)
Cod sursa(job #293342)
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
#define MAX_N 1024
#define pb push_back
#define sz size()
#define Inf 0x3f3f3f3f
int F[MAX_N][MAX_N];
int C[MAX_N][MAX_N];
int viz[MAX_N];
int T[MAX_N];
vector <int> G[MAX_N];
int N,M;
void read()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&N,&M);
int a,b,c;
while(M--)
{
scanf("%d%d%d",&a,&b,&c);
G[a].pb(b);
G[b].pb(a);
C[a][b] += c;
}
}
int BFS()
{
memset(viz,0,sizeof(viz));
int nod,V,i, c[MAX_N], p=1, u=1;
c[1] = 1;
for(;p<=u;)
{
nod = c[p++];
if(nod == N) continue;
for(i=0;i<G[nod].sz;++i)
{
V = G[nod][i];
if(viz[V] || C[nod][V] == F[nod][V]) continue;
viz[V] = 1;
c[++u] = V;
T[V] = nod;
}
}
return viz[N];
}
void maxflow()
{
int fmin,i, sol=0, nod;
for(;BFS();)
{
for(i=0;i<G[N].sz;++i)
{
nod = G[N][i];
if(!viz[N] || C[nod][N] == F[nod][N]) continue;
T[N] = nod;
fmin = Inf;
for(nod=N;nod!=1;nod=T[nod])
fmin = min(fmin, C[ T[nod] ][nod] - F[ T[nod] ][nod]);
if(!fmin) continue;
for(nod=N;nod!=1;nod=T[nod])
{
F[T[nod]][nod] += fmin;
F[nod][T[nod]] -= fmin;
}
sol+=fmin;
}
}
printf("%d\n",sol);
}
int main()
{
read();
maxflow();
return 0;
}