Pagini recente » Cod sursa (job #2142298) | Cod sursa (job #2141814) | Cod sursa (job #1723289) | Cod sursa (job #2297646) | Cod sursa (job #1513037)
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;
int n, m, i, minim, p, sum, u, x, y, z, vecin;
vector<int> v[1005];
bitset<1005> viz;
int c[1005][1005], f[1005][1005], t[1005], s[1005];
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int bfs(){
int p, u, i, vecin, nod;
int ok = 0;
viz.reset();
p = u = 1;
s[p] = 1;
viz[1] = 1;
while(p <= u){
nod = s[p];
for(i = 0; i < v[nod].size(); i++){
vecin = v[nod][i];
if(viz[vecin] == 0 && f[nod][vecin] < c[nod][vecin]){
viz[vecin] = 1;
u++;
s[u] = vecin;
t[vecin] = nod;
if(vecin == n){
ok = 1;
}
}
}
p++;
}
return ok;
}
int main(){
fin>> n >> m;
for(i = 1; i <= m; i++){
fin>> x >> y >> z;
v[x].push_back(y);
v[y].push_back(x);
c[x][y] = z;
}
while(bfs()){
for(i = 0; i < v[n].size(); i++){
vecin = v[n][i];
if(viz[vecin] == 1 && c[vecin][n] > f[vecin][n]){
minim = c[ vecin ][n] - f[ vecin ][n];
p = vecin;
while(t[p] > 0){
minim = min(minim, c[ t[p] ][ p ] - f[ t[p] ][ p ]);
p = t[p];
}
sum += minim;
f[ vecin ][n] += minim;
f[ n][ vecin ] -= minim;
p = vecin;
while(t[p] > 0){
f[ t[p] ][p] += minim;
f[ p][ t[p] ] -= minim;
p = t[p];
}
}
}
}
fout<< sum <<"\n";
return 0;
}