Pagini recente » Cod sursa (job #784121) | Cod sursa (job #256741) | Cod sursa (job #1667720) | Cod sursa (job #2257988) | Cod sursa (job #2210200)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
const int NMAX = 1000;
const int INF = 2e9;
int n, m;
int x, y, c;
int maxflow;
bool viz[1 + NMAX];
int tata[1 + NMAX];
int cap[1 + NMAX][1 + NMAX], flow[1 + NMAX][1 + NMAX];
vector <int> g[1 + NMAX];
bool bfs() {
int q[1 + NMAX];
q[0] = 0;
q[++q[0]] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
int i = 1;
while(i <= q[0]) {
int nod = q[i];
i++;
if(nod == n)
continue;
for(int j = 0; j < g[nod].size(); j++) {
int nod2 = g[nod][j];
if(cap[nod][nod2] == flow[nod][nod2] || viz[nod2])
continue;
viz[nod2] = 1;
q[++q[0]] = nod2;
tata[nod2] = nod;
}
}
return viz[n];
}
int main() {
cin >> n >> m;
for(int i = 1; i <= m; i++) {
cin >> x >> y >> c;
cap[x][y] += c;
g[x].push_back(y);
g[y].push_back(x);
}
maxflow = 0;
while(bfs()) {
for(int i = 0; i < g[n].size(); i++) {
int nod = g[n][i];
if(flow[nod][n] == cap[nod][n] || !viz[nod])
continue;
tata[n] = nod;
int minflow = INF;
nod = n;
while(nod != 1) {
minflow = min(minflow, cap[tata[nod]][nod] - flow[tata[nod]][nod]);
nod = tata[nod];
}
if(minflow == 0)
continue;
nod = n;
while(nod != 1) {
flow[tata[nod]][nod] += minflow;
flow[nod][tata[nod]] -= minflow;
nod = tata[nod];
}
maxflow += minflow;
}
}
cout << maxflow;
return 0;
}