Pagini recente » Cod sursa (job #987966) | Cod sursa (job #854849) | Cod sursa (job #396532) | Cod sursa (job #269066) | Cod sursa (job #2016926)
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1000;
vector<int> graph[1+MAX_N];
int kappa[1+MAX_N][1+MAX_N], papa[1+MAX_N], q[MAX_N], bestfl[1+MAX_N];
bool viz[1+MAX_N];
int flow;
static inline int min(int a, int b) {
if(a < b)
return a;
return b;
}
static inline bool augment(int n) {
int st, dr;
st = dr = 0;
q[dr++] = 1;
memset(viz + 1, 0, sizeof(bool) * n);
viz[1] = true;
bestfl[1] = 1000000000;
while(st < dr && !viz[n]) {
int nod = q[st++];
for(auto it: graph[nod])
if(kappa[nod][it] > 0 && !viz[it]) {
viz[it] = true;
q[dr++] = it;
papa[it] = nod;
bestfl[it] = min(bestfl[nod], kappa[nod][it]);
}
}
if(viz[n]) {
int i = n;
flow += bestfl[n];
while(i != 1) {
int j = papa[i];
kappa[j][i] -= bestfl[n];
kappa[i][j] += bestfl[n];
i = j;
}
return true;
}
return false;
}
int main() {
int n, m, a, b, c;
FILE *fin = fopen("maxflow.in", "r");
fscanf(fin, "%d%d", &n, &m);
for(int i = 0; i < m; ++i) {
fscanf(fin, "%d%d%d", &a, &b, &c);
kappa[a][b] = c;
graph[a].push_back(b);
graph[b].push_back(a);
}
fclose(fin);
for(int i = 1; i <= n; ++i)
random_shuffle(graph[i].begin(), graph[i].end());
while(augment(n));
FILE *fout = fopen("maxflow.out", "w");
fprintf(fout, "%d", flow);
fclose(fout);
return 0;
}
//flux maxim fara optimizarea cu arborele BFS