Pagini recente » Cod sursa (job #868795) | Cod sursa (job #2881914) | Cod sursa (job #2667472) | Cod sursa (job #65975) | Cod sursa (job #1824696)
#include <bits/stdc++.h>
#define Nmax 1001
#define inf 0x7fffffff
using namespace std;
FILE *fin = freopen("maxflow.in", "r", stdin);
FILE *fout = freopen("maxflow.out", "w", stdout);
int n, m;
int S, D, ans;
int r[Nmax][Nmax];
int deUnde[Nmax];
queue < int > Q;
void read()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++ i)
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
r[x][y] = z;
}
S = 1;
D = n;
}
bool BFS(int S, int D)
{
int i;
memset(deUnde, 0, sizeof(deUnde));
Q.push(S);
deUnde[S] = S;
deUnde[D] = D;
while (!Q.empty())
{
int x = Q.front();
Q.pop();
for (i = 1; i <= n; ++ i)
if (r[x][i] > 0 && deUnde[i] == 0)
{
deUnde[i] = x;
Q.push(i);
}
}
for (int i = 1; i <= n; ++ i)
if (i != D && r[i][D] > 0 && deUnde[i] != 0)
return true;
return false;
}
void solve()
{
ans = 0;
while (BFS(S, D)) {
for(int u = 1; u <= n; u++)
if (u != D && r[u][D] > 0 && deUnde[u] != 0) {
deUnde[D] = u;
int nod = D, cap = inf;
while (nod != S)
{
cap = min(cap, r[deUnde[nod]][nod]);
nod = deUnde[nod];
}
nod = D;
ans += cap;
while (nod != S)
{
r[deUnde[nod]][nod] -= cap;
r[nod][deUnde[nod]] += cap;
nod = deUnde[nod];
}
}
}
}
void write()
{
/*
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j)
printf("%2d ", r[i][j]);
printf("\n");
}//*/
printf("%d\n", ans);
}
int main() {
read();
solve();
write();
return 0;
}