Pagini recente » Cod sursa (job #2830413) | Cod sursa (job #1770245) | Cod sursa (job #3270319) | Cod sursa (job #25427) | Cod sursa (job #633572)
Cod sursa(job #633572)
//Flux Maxim
#include <cstdio>
#include <vector>
#define NMAX 1024
using namespace std;
int n, m;
int f[NMAX][NMAX], c[NMAX][NMAX], t[NMAX], q[NMAX], viz[NMAX];
vector<int> graf[NMAX];
int minim(int a, int b)
{
return a < b ? a:b;
}
bool BFS(int src)
{
int p = 1, u = 1, x, y, i;
memset(t, 0, sizeof(t));
memset(viz, 0, sizeof(viz));
q[p] = 1;
viz[p] = 1;
for(;p <= u; ++p)
{
x = q[p];
for(i = 0; i < graf[x].size(); ++i)
{
y = graf[x][i];
if(c[x][y] == f[x][y] || viz[y]) continue;
viz[y] = 1;
q[++u] = y;
t[y] = x;
}
}
return viz[n];
}
int main()
{
int i, j, flux, fmin;
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &n, &m);
for(i = 0; i < m; ++i)
{
int x, y, cp;
scanf("%d %d %d", &x, &y, &cp);
graf[x].push_back(y);
graf[y].push_back(x);
c[x][y] += cp;
}
for(flux = 0; BFS(1);)
for(i = 0; i < graf[n].size(); ++i)
{
int x = graf[n][i];
if(!viz[x] || f[x][n] == c[x][n]) continue;
t[n] = x;
fmin = 0x3f3f3f3f;
for(i = n; i != 1; i = t[i])
fmin = minim(fmin, c[t[i]][i] - f[t[i]][i]);
if(!fmin) continue;
for(i = n; i != 1; i = t[i])
{
f[t[i]][i] += fmin,
f[i][t[i]] -= fmin;
}
flux += fmin;
}
printf("%d\n", flux);
return 0;
}