Pagini recente » Cod sursa (job #1937495) | Cod sursa (job #1730384) | Cod sursa (job #2435539) | Cod sursa (job #2148993) | Cod sursa (job #303377)
Cod sursa(job #303377)
# include <cstdio>
# include <algorithm>
using namespace std;
# define FIN "maxflow.in"
# define FOUT "maxflow.out"
# define INF 1000000000
# define min(a, b) (a < b ? a : b)
# define MAXN 1005
struct Nod
{
int Fiu;
Nod *next;
} *Graf[MAXN], *p;
int N, M;
int Cap[MAXN][MAXN];
int T[MAXN], Q[MAXN];
int BFS()
{
Nod *j;
int vf, i;
memset(T, 0, sizeof(T));
Q[vf = 1] = 1; T[1] = -1;
for (i = 1; i <= vf; ++i)
{
for (j = Graf[Q[i]]; j != NULL; j = j -> next)
if (!T[j -> Fiu] && Cap[Q[i]][j -> Fiu])
{
T[j -> Fiu] = Q[i];
if (j -> Fiu == N) continue;
Q[++vf] = j -> Fiu;
}
}
return T[N];
}
int maxflow()
{
Nod *j;
int i, Flux = 0, Flow;
while (BFS())
for (j = Graf[N]; j != NULL; j = j -> next)
if (T[j -> Fiu] && Cap[j -> Fiu][N])
{
Flow = INF;
T[N] = j -> Fiu;
for (i = N; T[i] != -1; i = T[i])
Flow = min(Flow, Cap[T[i]][i]);
if (!Flow) continue;
Flux += Flow;
for (i = N; T[i] != -1; i = T[i])
{
Cap[T[i]][i] -= Flow;
Cap[i][T[i]] += Flow;
}
}
return Flux;
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d %d", &N, &M);
int a, b, c, i;
for (i = 1; i <= M; ++i)
{
scanf("%d %d %d", &a, &b, &c);
Cap[a][b] += c;
p = new Nod; p -> Fiu = b; p -> next = Graf[a]; Graf[a] = p;
p = new Nod; p -> Fiu = a; p -> next = Graf[b]; Graf[b] = p;
}
printf("%d", maxflow());
return 0;
}