Pagini recente » Cod sursa (job #1976423) | Cod sursa (job #1965665) | Cod sursa (job #2206708) | Cod sursa (job #1964017)
#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];
bool viz[NMax];
vector <int> v[NMax];
queue <int> q;
queue <int> fr;
bool bfs(int R) {
viz[R] = true;
q.push(R);
int nod, ok = 0;
for(int i = 0; i <= n; i++) {
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(nod);
ok++;
continue;
}
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()) {
int nod = fr.front();
int value = e[nod][n];
while(nod != 1) {
value = min(value, e[tata[nod]][nod]);
nod=tata[nod];
}
nod = fr.front();
while(nod != 1) {
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;
}