Pagini recente » Cod sursa (job #1432033) | Cod sursa (job #241315)
Cod sursa(job #241315)
# include <cstdio>
# include <vector>
using namespace std;
# define FIN "maxflow.in"
# define FOUT "maxflow.out"
# define min(A, B) (A < B ? A : B)
# define max 110000
# define PB push_back
# define MAX_N 1005
int N, M;
int Q[MAX_N];
int T[MAX_N];
int viz[MAX_N];
int F[MAX_N][MAX_N];
int C[MAX_N][MAX_N];
vector <int> G[MAX_N];
int BFS()
{
int ct;
vector <int> :: iterator it;
Q[ct = 0] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (int i = 0; i <= ct; ++i)
for (it = G[Q[i]].begin(); it < G[Q[i]].end(); ++it)
if (!viz[*it] && C[Q[i]][*it]>F[Q[i]][*it])
{
Q[++ct] = *it;
T[*it] = Q[i];
viz[*it] = 1;
}
return viz[N];
}
void maxflow()
{
int fmax = 0, flux;
vector <int> :: iterator it;
while (BFS())
for (it = G[N].begin(); it < G[N].end(); ++it)
{
flux = max;
if (C[*it][N] == F[*it][N] | !viz[*it]) continue;
T[N] = *it;
for (int i = N; i != 1; i = T[i])
flux = min(flux, C[T[i]][i] - F[T[i]][i]);
if (!flux) continue;
for (int i = N; i != 1; i = T[i])
{
F[T[i]][i] += flux;
//F[i][T[i]] -= flux;
}
fmax += flux;
}
printf("%d",fmax);
}
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%d%d",&N,&M);
int a, b, c;
for (int i = 1; i <= M; ++i)
{
scanf("%d%d%d",&a,&b,&c);
C[a][b] += c;
G[a].PB(b);
G[b].PB(a);
}
maxflow();
return 0;
}