Pagini recente » Cod sursa (job #158109) | Cod sursa (job #2936791) | Cod sursa (job #2672919) | Cod sursa (job #424682) | Cod sursa (job #626725)
Cod sursa(job #626725)
#include <stdio.h>
#include <stdlib.h>
#define NMAX 1010
#define INF (1<<30)
int Q[NMAX], from[NMAX], viz[NMAX];
int *A[NMAX];
int C[NMAX][NMAX];
int head, tail, s, d;
int N, M;
int bfs();
inline int min(int a, int b)
{
return (a<b)?a:b;
}
void read()
{
int i, x, y, cost;
scanf("%d %d", &N, &M);
for (i=1; i<=N; ++i) {
A[i] = (int*)realloc(A[i], sizeof(int));
A[i][0] = 0;
}
for (i=1; i<=M; ++i) {
scanf("%d %d %d", &x, &y, &cost);
++A[x][0];
A[x] = (int*)realloc(A[x], (A[x][0]+1)*sizeof(int));
A[x][A[x][0]] = y;
++A[y][0];
A[y] = (int*)realloc(A[y], (A[y][0]+1)*sizeof(int));
A[y][A[y][0]] = x;
C[x][y] = cost;
}
}
int max_flow()
{
int result = 0;
while (1) {
int path_cap = bfs();
if (path_cap == 0)
break;
result += path_cap;
}
return result;
}
int bfs()
{
int flag = 1;
int v, path_cap, i;
for (i=1; i<=N; ++i) {
viz[i] = 0;
from[i] = -1;
}
head = tail = 0;
Q[++head] = s;
viz[s] = 1;
while (tail < head && flag) {
int node = Q[++tail];
for (i=1; i<=A[node][0]; ++i)
if (!viz[A[node][i]] && C[node][A[node][i]] > 0) {
viz[A[node][i]] = 1;
from[A[node][i]] = node;
Q[++head] = A[node][i];
if (A[node][i] == d) {
flag = 0;
break;
}
}
}
v = d, path_cap = INF;
while (from[v] > -1) {
path_cap = min(path_cap, C[from[v]][v]);
v = from[v];
}
v = d;
while (from[v] > -1) {
C[from[v]][v] -= path_cap;
C[v][from[v]] += path_cap;
v = from[v];
}
if (path_cap == INF)
return 0;
return path_cap;
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
read();
s = 1, d = N;
printf("%d ", max_flow());
return 0;
}