Pagini recente » Borderou de evaluare (job #1549057) | Cod sursa (job #2805742) | Cod sursa (job #2439692) | Cod sursa (job #405483) | Cod sursa (job #2120345)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int in, sf, nod, q, vecin, t[1004], ramas[1004][1004], noduri, muchii, a, b, c;
int poz, total, urm, flow;
struct Coada
{
int nod, flow, prev;
}coada[100004];
vector <int> lista[1004];
int bfs()
{
in = 1;
sf = 1;
coada[1].nod = 1;
coada[1].flow = 551000000;
while(in <= sf)
{
nod = coada[in].nod;
q = lista[nod].size();
for(int i=0; i < q; i++)
{
vecin = lista[nod][i];
if(t[vecin] == 0 && ramas[nod][vecin] != 0)
{
t[vecin] = 1;
sf++;
coada[sf].nod = vecin;
coada[sf].flow = min(coada[in].flow, ramas[nod][vecin]);
coada[sf].prev = in;
if(coada[sf].nod == noduri)
return sf;
}
}
in++;
}
return -1;
}
int main()
{
cin >> noduri >> muchii;
for(int i=1; i <= muchii; i++)
{
cin >> a >> b >> c;
lista[a].push_back(b);
lista[b].push_back(a);
ramas[a][b] = c;
}
while(bfs() != -1)
{
poz = sf;
total += coada[poz].flow;
flow = coada[poz].flow;
while(coada[poz].prev != 0)
{
nod = coada[coada[poz].prev].nod;
urm = coada[poz].nod;
ramas[nod][urm] -= flow;
ramas[urm][nod] += flow;
poz = coada[poz].prev;
}
for(int i=1; i <= sf; i++)
t[coada[i].nod] = 0;
}
cout << total;
}