Pagini recente » Cod sursa (job #1558842) | Cod sursa (job #1041732) | Cod sursa (job #1607723) | Cod sursa (job #3168146) | Cod sursa (job #2958952)
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <algorithm>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int c[1024][1024]; ///capacitate intre doua noduri
int f[1024][1024]; ///capacitate consumata
int tata[1024]; ///tatal fiecarui nod
vector<int> list_ad[1024];
vector<int> viz;
int nod, n, m, x, y, z, i, j, minn, flow;
int bfs()
{
viz.assign(n+1, 0);
queue<int> coada;
coada.push(1); ///nodul de start
while(!coada.empty())
{
nod = coada.front();
coada.pop();
viz[nod] = 1;
if(nod == n)
break; ///opresc parcurgerea daca ajung la destinatie
for(int j = 0; j < list_ad[nod].size(); j++)
{
if(viz[list_ad[nod][j]] == 0 && c[nod][list_ad[nod][j]] > f[nod][list_ad[nod][j]]) ///daca nu e viz si daca drumul nu a fost consumat
{
coada.push(list_ad[nod][j]);
viz[list_ad[nod][j]] = 1;
tata[list_ad[nod][j]] = nod; ///retin tatal nodului
}
}
}
return viz[n];///ne zice daca a ajuns la final drumul -> nu s a gasit fluxul maxim deci continuam
}
int main()
{
fin>>n>>m;
//la.resize(n+1);
for(i = 0; i < m; i++){
fin>>x>>y>>z;
list_ad[x].push_back(y);
list_ad[y].push_back(x);
c[x][y] = z;
}
flow = 0;
while(bfs())
{
for(i = 0; i < list_ad[n].size(); i++)
{
nod = list_ad[n][i];
if (f[nod][n] == c[nod][n] || !viz[nod])
continue;
tata[n] = nod;
int minn=9999999;
for (j = n; j > 1; j = tata[j])
{
minn = min(minn, c[tata[j]][j] - f[tata[j]][j]); ///calculez capacitatea minima a drumului (capacitate totala-consumata)
}
if (minn == 0)
continue;
for (j = n; j > 1; j = tata[j]) ///modific capacitatile drumurilor si maresc flowul rezidual
{
f[tata[j]][j] += minn;
f[j][tata[j]] -= minn;
}
flow = flow + minn;
}
}
fout<<flow;
return 0;
}