Pagini recente » Cod sursa (job #1521358) | Cod sursa (job #2316724) | Cod sursa (job #1906213) | Cod sursa (job #1026507) | Cod sursa (job #2931096)
#include <stdio.h>
#define NMAX 1000
int n, m;
int capacity[NMAX][NMAX];
short g[NMAX][NMAX];
short ptr[NMAX], level[NMAX], queue[NMAX], top;
inline const int& min(const int& x, const int& y)
{
return (x <= y ? x : y);
}
int dfs(int u, int flow)
{
if(u == n - 1)
return flow;
for( ; ptr[u] <= g[u][0]; ptr[u]++)
{
int v = g[u][ptr[u]];
if(level[v] != level[u] + 1 || capacity[u][v] == 0)
continue;
int crt = dfs(v, min(flow, capacity[u][v]));
if(crt == 0)
continue;
capacity[u][v] -= crt;
capacity[v][u] += crt;
return crt;
}
return 0;
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
u--; v--;
capacity[u][v] = w;
g[u][++g[u][0]] = v;
g[v][++g[v][0]] = u;
}
int maxflow = 0;
while(true)
{
for(int i = 0; i < n; i++)
level[i] = -1;
level[0] = 0;
queue[0] = 0;
top = 1;
for(int i = 0; i < top; i++)
{
int u = queue[i];
for(int i = 1; i <= g[u][0]; i++)
{
int v = g[u][i];
if(level[v] == -1 && capacity[u][v] != 0)
{
level[v] = level[u] + 1;
queue[top++] = v;
}
}
}
if(level[n - 1] == -1)
break;
for(int i = 0; i < n; i++)
ptr[i] = 1;
while(int flow = dfs(0, 0x3f3f3f3f))
maxflow += flow;
}
printf("%d\n", maxflow);
return 0;
}