Pagini recente » Cod sursa (job #1494079) | Cod sursa (job #1440650) | Cod sursa (job #547612) | Cod sursa (job #3178834) | Cod sursa (job #501162)
Cod sursa(job #501162)
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 1024
#define vii vector<vector<int> >
#define vi vector<int>
#define pb(a) push_back(a)
int N; // numarul de noduri
int C[NMAX][NMAX]; //capacitati
int F[NMAX][NMAX]; //flow
vii G; // graful ( adiacentele)
int coada[NMAX]; // coada pt bfs
int viz[NMAX]; // vizitati
int BFS[NMAX]; // BFS-ul
inline int bfs(int sursa, int sink) {
for (int i = 1; i <= N; ++i) viz[i] = 0;
coada[0] = 0;
// pleaca de la sursa
coada[++coada[0]] = sursa;
viz[sursa] = 1;
for (int i = 1; i <= coada[0]; ++i) {
int nod = coada[i];
if (nod == sink) continue;
for (int j = 0; j < G[nod].size(); ++j) {
int nod2 = G[nod][j];
if (C[nod][nod2] == F[nod][nod2] || viz[nod2]) continue;
viz[nod2] = 1;
coada[++coada[0]] = nod2;
BFS[nod2] = nod;
}
}
return viz[sink];
}
int max_flow(int sursa, int sink) {
int flow = 0;
while (bfs(sursa, sink)) {
for (int i = 0; i < G[sink].size(); ++i) {
int nod = G[sink][i];
if (F[nod][sink] == C[nod][sink] || !viz[nod]) continue;
int cresc = C[nod][sink] - F[nod][sink];
BFS[sink] = nod;
for (nod = sink; nod != sursa; nod = BFS[nod])
cresc = min(cresc, C[BFS[nod]][nod] - F[BFS[nod]][nod]);
if (cresc == 0) continue;
for (nod = sink; nod != sursa; nod = BFS[nod]) {
F[BFS[nod]][nod] += cresc;
F[nod][BFS[nod]] -= cresc;
}
flow += cresc;
}
}
return flow;
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int M;
scanf("%d %d", &N, &M);
G.resize(N+1);
while (M--) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
C[a][b] += c;
G[a].pb(b); G[b].pb(a);
}
printf("%d\n", max_flow(1, N));
return 0;
}