Pagini recente » Cod sursa (job #2240934) | Cod sursa (job #3265907) | Cod sursa (job #2681605) | Cod sursa (job #1574521) | Cod sursa (job #1827193)
#include <cstdio>
const int MAX_N = 1000;
const int MAX_M = 5000;
const int INF = 2000000000;
int mc[1+2*MAX_M], last[1+MAX_N], next[1+2*MAX_M], cap[1+2*MAX_M], flux[1+2*MAX_M];
int inv[1+2*MAX_M];
bool viz[1+MAX_N];
int prev[1+MAX_N], muchie[1+MAX_N];
int q[MAX_N], st, dr;
inline void addMuchie(int id, int a, int b, int c) {
mc[id] = b;
next[id] = last[a];
last[a] = id;
cap[id] = c;
}
inline int min(int a, int b) {
if(a < b)
return a;
return b;
}
int total;
inline bool pump(int node) {
int best, i;
best = INF;
i = node;
while(i > 1 && best > 0) {
best = min(best, cap[muchie[i]] - flux[muchie[i]]);
i = prev[i];
}
if(best > 0) {
i = node;
while(i > 1) {
flux[muchie[i]] += best;
flux[inv[muchie[i]]] -= best;
i = prev[i];
}
total = total + best;
return true;
} else
return false;
}
bool augment(int dest) {
int node;
bool ok = false, rez;
st = dr = 0;
q[dr] = 1;
++dr;
while(dr - st > 0) {
node = q[st];
++st;
int i = last[node];
while(i != 0) {
if(mc[i] != dest && flux[i] < cap[i] && !viz[mc[i]]) {
prev[mc[i]] = node;
muchie[mc[i]] = i;
q[dr] = mc[i];
++dr;
viz[mc[i]] = true;
} else if(mc[i] == dest && flux[i] < cap[i]) {
prev[mc[i]] = node;
muchie[mc[i]] = i;
rez = pump(mc[i]);
if(rez) ok = true;
}
i = next[i];
}
}
return ok;
}
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);
addMuchie(i * 2 + 1, a, b, c);
inv[i * 2 + 1] = i * 2 + 2;
addMuchie(i * 2 + 2, b, a, 0);
inv[i * 2 + 2] = i * 2 + 1;
}
fclose(fin);
while(augment(n)) {
for(int i = 1; i <= n; ++i) {
viz[i] = false;
}
}
FILE *fout = fopen("maxflow.out", "w");
fprintf(fout, "%d", total);
fclose(fout);
return 0;
}