Pagini recente » Cod sursa (job #325500) | Cod sursa (job #2315292) | Cod sursa (job #3176615) | Cod sursa (job #550154) | Cod sursa (job #480213)
Cod sursa(job #480213)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#define NM 1005
//chestiile generale
vector<int> G[NM];
int Cap[NM][NM], Flux[NM][NM];
int N, M;
//chestiile pentru flux
int tata[NM], coada[NM];
bool viz[NM];
int unitati_flux;
int poti_pompa()
{
//parcurgere in latime
memset (viz, false, sizeof(viz));
int st = 0, dr = -1;
coada[++dr] = 1;
viz[1] = true;
int se_poate_ajunge = 0;
while (st <= dr)
{
int nod = coada[st];
++st;
if (nod == N)
{
se_poate_ajunge = 1;
break;
}
for (int i = 0; i < G[nod].size(); ++i)
{
int nnod = G[nod][i];
if (viz[nnod]) continue;
if ((Cap[nod][nnod] - Flux[nod][nnod]) <= 0) continue;
coada[++dr] = nnod;
viz[nnod] = true;
tata[nnod] = nod;
}
}
if (!se_poate_ajunge) return 0;
// aflu cantitatea de pompat
int nod = N, flux_supl = 1000000000;
while (tata[nod])
{
flux_supl = min(flux_supl, Cap[tata[nod]][nod] - Flux[tata[nod]][nod]);
nod = tata[nod];
}
unitati_flux += flux_supl;
// refac reteaua
nod = N;
while (tata[nod])
{
Flux[tata[nod]][nod] += flux_supl;
Flux[nod][tata[nod]] -= flux_supl;
nod = tata[nod];
}
return 1;
}
int main()
{
int a, b, c;
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
scanf ("%d %d", &N, &M);
for (int i = 1; i <= M; ++i)
{
scanf ("%d %d %d", &a, &b, &c);
Cap[a][b] += c;
G[a].push_back(b);
G[b].push_back(a);
}
while (poti_pompa());
printf ("%d", unitati_flux);
return 0;
}