Pagini recente » Cod sursa (job #1683243) | Cod sursa (job #14289) | Cod sursa (job #2317010) | Cod sursa (job #234002) | Cod sursa (job #2979732)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define INF 0x3f3f3f3f
const int NMAX = 1005;
const int MMAX = 5005;
int tt[NMAX], c[NMAX][NMAX], f[NMAX][NMAX], cd[NMAX];
int viz[NMAX];
vector<int> G[NMAX];
int n, m, x, y, z, flow, fminn;
int bfs()
{
cd[0] = 1;
cd[1] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (int i=1;i<=cd[0];i++) {
int nod = cd[i];
if (nod == n)
continue;
for (int j=0;j<G[nod].size();j++){
int vec = G[nod][j];
if (c[nod][vec] == f[nod][vec] || viz[vec]) continue;
viz[vec] = 1;
cd[++ cd[0]] = vec;
tt[vec] = nod;
}
}
return viz[n];
}
int main()
{
fin >> n >> m;
for (int i=1;i<=m;i++){
fin >> x >> y >> z;
c[x][y] += z;
G[x].push_back(y);
G[y].push_back(x);
}
while (bfs()) {
for (int i=0;i<G[n].size();i++){
int nod = G[n][i];
if (f[nod][n] == c[nod][n] || !viz[nod]) continue;
tt[n] = nod;
fminn = INF;
for (nod=n;nod!=1;nod=tt[nod]){
fminn = min(fminn, c[tt[nod]][nod] - f[tt[nod]][nod]);
}
if (fminn == 0) continue;
for (nod=n;nod!=1;nod=tt[nod]){
f[tt[nod]][nod] += fminn;
f[nod][tt[nod]] -= fminn;
}
flow += fminn;
}
}
fout << flow << '\n';
return 0;
}