Pagini recente » Istoria paginii runda/jhhjvjhv/clasament | Cod sursa (job #1028905) | Cod sursa (job #1002118) | Cod sursa (job #806275) | Cod sursa (job #241240)
Cod sursa(job #241240)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define mx 1024
using namespace std;
int flux[mx][mx], capc[mx][mx];
vector <int> ld[mx];
int n, m, x, y, z, flux_max;
int tat[mx];
bool bfs(int s, int d)
{
int que[mx];
memset(tat, 0, sizeof(tat));
que[0] = 1;
tat[1] = -1;
for (int p = 0, u = 0; p <= u; p++)
for (int i = 0, nod = que[p]; i < ld[nod].size(); i++)
{
int x = ld[nod][i];
if (!tat[x] && capc[nod][x] > flux[nod][x])
{
que[++u] = x;
tat[x] = nod;
if (x == d)
return 1;
}
}
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++)
{
scanf("%d %d %d", &x, &y, &z);
capc[x][y] = z;
ld[x].push_back(y);
}
for (int r = LONG_MAX; bfs(1, n); flux_max += r)
{
for (int i = n; i != 1; i = tat[i])
r = min(r, capc[tat[i]][i] - flux[tat[i]][i]);
for (int i = n; i != 1; i = tat[i])
{
flux[tat[i]][i] += r;
flux[i][tat[i]] -= r;
}
}
printf("%d\n", flux_max);
fclose(stdin);
fclose(stdout);
return 0;
}