Pagini recente » Cod sursa (job #878876) | Cod sursa (job #626314) | Istoria paginii runda/testuletzzzz | Cod sursa (job #1093463) | Cod sursa (job #2006112)
#include <bits/stdc++.h>
using namespace std;
FILE *fin = fopen("maxflow.in", "r");
FILE *fout = fopen("maxflow.out", "w");
int n, m;
vector <int> v[1001];
int cap[1001][1001], flx[1001][1001];
bool viz[1001];
int pre[1001];
inline bool BFS() {
queue <int> q;
pre[1] = 0;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
q.push(1);
while(!q.empty()) {
int nod = q.front();
q.pop();
if(nod == n) {
continue;
}
for(auto &x : v[nod]) if(viz[x] == 0 && flx[x] != cap[x]) {
viz[x] = 1;
pre[x] = nod;
q.push(x);
}
}
return viz[n];
}
int main() {
fscanf(fin, "%d%d", &n, &m);
for(int i = 1;i <= m;i++) {
int x, y, z;
fscanf(fin, "%d%d%d", &x, &y, &z);
v[x].push_back(y);
v[y].push_back(x);
cap[x][y] += z;
}
int ans = 0, st = 1;
while(BFS() && st) {
int flux = INT_MAX;
for(auto &x : v[n]) {
if(viz[x] == 1 && flx[x][n] != cap[x][n]) {
pre[n] = x;
int sursa = n;
flux = INT_MAX;
while(sursa != 1) {
flux = min(flux, cap[pre[sursa]][sursa] - flx[pre[sursa]][sursa]);
sursa = pre[sursa];
}
if(flux == 0) {
st = 0;
break;
}
sursa = n;
while(sursa != 1) {
flx[pre[sursa]][sursa] += flux;
flx[sursa][pre[sursa]] -= flux;
sursa = pre[sursa];
}
ans += flux;
}
}
}
fprintf(fout, "%d", ans);
fclose(fin);
fclose(fout);
return 0;
}