Pagini recente » Cod sursa (job #1289930) | infoarena_runda_3 | Cod sursa (job #2902633) | Cod sursa (job #552264) | Cod sursa (job #2081433)
#include<fstream>
#include<vector>
using namespace std;
ifstream in ( "maxflow.in");
ofstream out("maxflow.out");
vector<int>v[1001];
int cap[1001][1001],flux[1001][1001],tata[1001],vecin,graf[1001],vec[1001],minim,x,n,m,a,b,c,flux_total;
bool bfs (int f) {
bool ok = 0;
for (int i = 1; i <= n; i ++) {
graf[i] = 0;
}
graf[1] = 1;
tata[1] = 0;
vec [1] = 1;
for (int st = 1, dr = 1; st <= dr; st ++) {
a = vec[st];
for (int i = 0; i < v[a].size(); i ++) {
b = v[a][i];
if (cap[a][b] - flux[a][b] > 0 && graf[b] == 0) {
if (b != n) {
graf[b] = graf[a] + 1;
tata[b] = a;
vec[++dr] = b;
}
else{
ok = 1;
tata[b] = a;
break;
}
}
}
}
if (ok) {
return 1;
}
else{
return 0;
}
}
int main (void) {
in >> n >> m;
for (int i = 1; i <= m; i ++) {
in >> a >> b >> c;
v[a].push_back(b);
v[b].push_back(a);
cap[a][b] = c;
}
for (int i = 0; i < v[n].size(); i ++) {
vecin = v[n][i];
while (bfs(vecin)) {
minim = cap[vecin][n] - flux[vecin][n];
x = n;
while (tata[x] != 0) {
minim = min (minim,cap[tata[x]][x]-flux[tata[x]][x]);
x = tata[x];
}
x = n;
while (tata[x] != 0) {
flux[tata[x]][x] += minim;
flux[x][tata[x]] -= minim;
x = tata[x];
}
flux_total += minim;
}
}
out << flux_total;
return 0;
}