Pagini recente » Cod sursa (job #1713998) | Cod sursa (job #2727330) | Cod sursa (job #891983) | Cod sursa (job #2838791) | Cod sursa (job #433934)
Cod sursa(job #433934)
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
#define pb push_back
#define N 1010
#define INF 0x3f3f3f3f
vector<int> a[N];
int n, m, flux, f[N][N], tata[N], q[N];
void citire(){
int i, x, y, z;
scanf("%d %d", &n, &m);
for (i = 1; i <= m; ++i){
scanf("%d %d %d", &x, &y, &z);
a[x].pb(y); a[y].pb(x);
f[x][y] = z;
}
}
int bfs(){
int ok = 0, x, p, u, i;
memset(tata, 0, sizeof(tata));
tata[1] = 1; q[0] = 1;
for (p = 0, u = 0; p <= u; p++){
x = q[p];
for (i = 0; i < a[x].size(); ++i)
if(f[x][a[x][i]] > 0 && !tata[a[x][i]]){
if (a[x][i] == n)
ok = 1;
else{
tata[a[x][i]] = x;
q[++u] = a[x][i];
}
}
}
return ok;
}
void rezolva(){
int i, j, minim;
while (bfs()){
for (i = 0; i < a[n].size(); ++i)
if (tata[a[n][i]] && f[a[n][i]][n] > 0){
minim = f[a[n][i]][n];
for (j = a[n][i]; j != 1; j = tata[j])
if (f[tata[j]][j] < minim)
minim = f[tata[j]][j];
f[a[n][i]][n] -= minim; f[n][a[n][i]] += minim;
for (j = a[n][i]; j != 1; j = tata[j])
f[tata[j]][j] -= minim, f[j][tata[j]] += minim;
flux += minim;
}
}
}
int main(){
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
citire();
rezolva();
printf("%d\n", flux);
return 0;
}