Pagini recente » Cod sursa (job #165421) | Cod sursa (job #2252996) | Cod sursa (job #2745597) | Cod sursa (job #1862923) | Cod sursa (job #2554154)
#include <fstream>
#include <cstring>
#define INF 9999999
#define min(a,b) (a<b) ? (a) : (b)
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
void BFS();
int n, m, nrfr, minim, frunze[1005], tata[1005], f[1005][1005], c[1005][1005], a[1005][1005];
int main()
{
int i, j, x, y, schimbare;
fin >> n >> m;
for (i = 1; i <= m; i++)
{
fin >> x >> y;
fin >> c[x][y];
a[x][y] = a[y][x] = 1;
}
do
{
schimbare = 0;
BFS();
for (i = 1; i <= nrfr; i++)
{
tata[n] = frunze[i];
x = n;
minim = INF;
while (x != 1)
{
minim = min(minim, c[tata[x]][x] - f[tata[x]][x]);
x = tata[x];
}
if (minim)
{
schimbare = 1;
x = n;
while (x != 1)
{
f[tata[x]][x] += minim;
f[x][tata[x]] -= minim;
x = tata[x];
}
}
}
} while (schimbare);
x = 0;
for (i = 1; i <= n; i++)
if (f[1][i] > 0)
x += f[1][i];
fout << x << '\n';
return 0;
}
void BFS()
{
int i, aux, in, sf, C[1005], uz[1005];
in = sf = 0;
nrfr = 0;
memset(uz, 0, sizeof(uz));
C[sf++] = 1;
uz[1] = 1;
while (in < sf)
{
aux = C[in++];
for (i = 1; i < n;i++)
if (a[aux][i] && !uz[i] && f[aux][i]<c[aux][i])
{
tata[i] = aux;
C[sf++] = i;
uz[i] = 1;
}
if (a[aux][n] && f[aux][n] < c[aux][n])
frunze[++nrfr] = aux;
}
}