Pagini recente » Cod sursa (job #1863812) | Cod sursa (job #2610810) | Cod sursa (job #911262) | Cod sursa (job #719182) | Cod sursa (job #2554151)
#include <fstream>
#include <cstring>
#include <iostream>
#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 start);
int n, m, nrfrunze, f[1005][1005], c[1005][1005], tata[1005], fr[1005], a[1005][1005];
int main()
{
int x, y, pre, nod, minim;
fin >> n >> m;
for (int i=1;i<=m;i++)
{
fin >> x >> y;
fin >> c[x][y];
a[x][y] = a[y][x] = 1;
}
int schimbare;
do
{
schimbare = 0;
nrfrunze = 0;
BFS(1);
for (int i=1;i<=nrfrunze;i++)
{
tata[n] = fr[i];
nod = n;
minim = INF;
while (tata[nod])
{
pre = tata[nod];
minim = min(minim, c[pre][nod]-f[pre][nod]);
nod = pre;
}
if (minim)
{
schimbare = 1;
nod = n;
while (tata[nod])
{
pre = tata[nod];
f[pre][nod] += minim;
f[nod][pre] -= minim;
nod = pre;
}
}
}
} while (schimbare);
int ans = 0;
for (int i=1;i<=n;i++)
ans += f[1][i];
fout << ans << '\n';
return 0;
}
void BFS(int start)
{
int in=0, sf=0, Q[1005], uz[1005];
memset(uz,0,sizeof(uz));
Q[sf++] = start;
uz[start] = 1;
while (in < sf)
{
int aux = Q[in++];
for (int i=1;i<n;i++)
if (a[aux][i] && !uz[i] && f[aux][i] < c[aux][i])
{
Q[sf++] = i;
uz[i] = 1;
tata[i] = aux;
}
if (a[aux][n] && f[aux][n] < c[aux][n])
fr[++nrfrunze] = aux;
}
}