Pagini recente » Cod sursa (job #1146401) | Cod sursa (job #2845420) | Cod sursa (job #2462734) | Cod sursa (job #887243) | Cod sursa (job #1766609)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
const int NMAX = 1005;
const int MMAX = 5005;
const int MULT = 200010;
int N, M;
vector<int> G[NMAX];
int capac[NMAX][NMAX];
int flux[NMAX][NMAX];
bool viz[NMAX];
int recon[NMAX];
int BFSCheck () {
memset (viz, 0, sizeof(viz));
queue<int> Q;
Q.push(1);
viz[1] = 1;
while (!Q.empty()) {
if (Q.front() != N) {
for (auto &it : G[Q.front()]) {
if ( !viz[it] && capac[Q.front()][it] > flux[Q.front()][it]) {
Q.push(it);
recon[it] = Q.front();
viz[it] = 1;
}
}
}
Q.pop();
}
return viz[N];
}
int fflux () {
int ANS = 0;
while (BFSCheck()) {
for (auto &it : G[N]) {
if (viz[it] && capac[it][N] > flux[it][N]) {
recon[N] = it;
int add;
add = MULT;
for (int i = N; i != 1; i = recon[i]) {
add = min (add, capac[recon[i]][i] - flux[recon[i]][i]);
}
for (int i = N; i != 1; i = recon[i]) {
flux[recon[i]][i] += add;
flux[i][recon[i]] -= add;
}
ANS += add;
}
}
}
return ANS;
}
int main ()
{
fin >> N >> M;
for (int i = 1; i <= M; i++) {
int x, y, c;
fin >> x >> y >> c;
G[x].push_back(y);
G[y].push_back(x);
capac[x][y] = c;
}
fout << fflux();
return 0;
}