Pagini recente » Cod sursa (job #2829950) | Cod sursa (job #2052228) | Cod sursa (job #1616744) | Cod sursa (job #42963) | Cod sursa (job #763408)
Cod sursa(job #763408)
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX_N 1010
int n, m, improve = 1, ans;
int tata[MAX_N], Q[MAX_N], use[MAX_N], flux[MAX_N];
int C[MAX_N][MAX_N], F[MAX_N][MAX_N];
vector <int> G[MAX_N];
void bfs() {
int st = 0, dr = 1;
Q[1] = 1; use[1] = 1; flux[1] = 1000000000;
while (st < dr) {
st++;
int nod = Q[st];
for (vector <int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
if (use[*it] == 0 && C[nod][*it] - F[nod][*it] > 0) {
flux[*it] = min(flux[nod], C[nod][*it] - F[nod][*it]);
tata[*it] = nod;
use[*it] = 1;
Q[++dr] = *it;
}
if (use[n]) //optimizare!!
break;
}
improve = flux[n];
if (improve) {
for (int i = n; i != 1; i = tata[i]) {
F[tata[i]][i] += flux[n];
F[i][tata[i]] -= flux[n];
}
}
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
G[a].push_back(b);
G[b].push_back(a);
C[a][b] += c;
}
while (improve) {
memset(tata, 0, sizeof(tata));
memset(use, 0, sizeof(use));
memset(flux, 0, sizeof(flux));
bfs();
ans += improve;
}
printf("%d\n", ans);
return 0;
}