Pagini recente » Cod sursa (job #2404056) | Cod sursa (job #580058) | Cod sursa (job #2458162) | Cod sursa (job #1762065) | Cod sursa (job #601744)
Cod sursa(job #601744)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define maxN 1005
#define PB push_back
#define inf (1 << 30)
int N, sol;
vector <int> lista[maxN];
queue <int> Q;
int tata[maxN], cp[maxN][maxN], fl[maxN][maxN];
bool cont[maxN];
int poti_pompa ()
{
Q.push (1);
memset (cont, false, sizeof (cont));
cont[1] = true;
for ( ; ! Q.empty(); )
{
int nod = Q.front();
Q.pop();
for (int i = 0; i < lista[nod].size(); ++ i)
{
int node = lista[nod][i];
if (cp[nod][node] - fl[nod][node] == 0) continue;
if (cont[node]) continue;
Q.push (node);
tata[node] = nod;
cont[node] = true;
}
}
if ( ! cont[N] ) return 0;
int nod = N;
int minim = inf;
while (nod != 1)
{
minim = min (minim, cp[tata[nod]][nod] - fl[tata[nod]][nod]);
nod = tata[nod];
}
nod = N;
while (nod != 1)
{
fl[tata[nod]][nod] += minim;
fl[nod][tata[nod]] -= minim;
nod = tata[nod];
}
sol += minim;
return 1;
}
int main()
{
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
int M;
scanf ("%d %d", &N, &M);
for (int i = 1; i <= M; ++ i)
{
int x, y, z;
scanf ("%d %d %d", &x, &y, &z);
lista[x].PB (y);
lista[y].PB (x);
cp[x][y] += z;
}
while (poti_pompa());
printf ("%d", sol);
return 0;
}