Pagini recente » Cod sursa (job #2654193) | Cod sursa (job #1976016) | Cod sursa (job #1499989) | Cod sursa (job #2374935) | Cod sursa (job #1964013)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMax 1001
#define oo 999999999
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m, x, y, z, e[NMax][NMax], tata[NMax], minValue[NMax];
bool viz[NMax];
vector <int> v[NMax];
queue <int> q;
queue <pair<int, int> >fr;
bool bfs(int R) {
viz[R] = true;
q.push(R);
int nod, ok = 0;
for(int i = 0; i <= n; i++) {
minValue[i] = oo;
viz[i] = false;
}
while(!q.empty()) {
nod = q.front();
q.pop();
int nS = v[nod].size();
for(int i = 0; i < nS; ++i) {
int fiu = v[nod][i];
if(viz[fiu] || e[nod][fiu] == 0)
continue;
if(fiu == n) {
fr.push(make_pair(nod, min(minValue[nod], e[nod][fiu])));
ok++;
continue;
}
minValue[fiu] = min(minValue[nod], e[nod][fiu]);
tata[fiu] = nod;
viz[fiu] = true;
q.push(fiu);
}
}
return ok != 0;
}
int main()
{
fin>>n>>m;
for(int i = 1; i <= m; ++i) {
fin>>x>>y>>z;
v[x].push_back(y);
v[y].push_back(x);
e[x][y] = z;
}
int R = 1, maxFlow = 0;
while(bfs(1)) {
while(!fr.empty()) {
pair <int, int> Frunza = fr.front();
int nod = Frunza.first;
int value = Frunza.second;
value = min(value, e[nod][n]);
e[n][nod] += value;
e[nod][n] -= value;
while(nod != 1) {
//value = min(value, e[tata[nod]][nod]);
e[nod][tata[nod]] += value;
e[tata[nod]][nod] -= value;
nod = tata[nod];
}
maxFlow += value;
fr.pop();
}
}
fout<<maxFlow;
fin.close();
fout.close();
return 0;
}