Pagini recente » Cod sursa (job #1123127) | Cod sursa (job #792812) | Cod sursa (job #1525474) | Cod sursa (job #2278788) | Cod sursa (job #2209200)
#include <fstream>
#include <vector>
#include <bitset>
#define INF 2000000000
#define DIM 1002
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
int c[DIM][DIM],f[DIM][DIM],Q[DIM],t[DIM];
bitset<DIM> v;
vector <int> L[DIM];
int n,m,i,x,y,z,flux,dif;
int bfs() {
int p,u;
v.reset();
p = u = 1;
Q[1] = 1;
v[1] = 1;
int dest = 0;
while (p <= u){
for (int i=0;i<L[ Q[p] ].size();i++){
int vecin = L[ Q[p] ][i];
if (v[vecin] == 0 && c[ Q[p] ][vecin] > f[ Q[p] ][vecin]) {
u++;
Q[u] = vecin;
v[vecin] = 1;
t[vecin] = Q[p];
if (vecin == n)
dest = 1;
}
}
p++;
}
return dest;
}
int main (){
fin>>n>>m;
for (i=1;i<=m;i++){
fin>>x>>y>>z;
L[x].push_back (y);
L[y].push_back (x);
c[x][y] = z; /// capacitatea
c[y][x] = 0;
/// f[x][y] = f[y][x] = 0; initial
}
while (bfs()) {
/// fac 2 parcurgeri ale vectorului de tati;
x = n;
dif = INF;
while (t[x] != 0){
dif = min (dif,c[t[x]][x]-f[t[x]][x]);
x = t[x];
}
flux += dif;
/// marim fluxurile
x = n;
while (t[x] != 0){
f[ t[x] ][x] += dif;
f[x][ t[x] ] -= dif;
x = t[x];
}
}
fout<<flux;
return 0;
}