Pagini recente » Cod sursa (job #2801839) | Cod sursa (job #1328515) | Cod sursa (job #2769735) | Cod sursa (job #1390866) | Cod sursa (job #1345741)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define nmax 1010
using namespace std;
vector<int> gf[nmax];
int c[nmax][nmax], f[nmax][nmax], t[nmax];
int n,m, f_min, f_max;
bitset<nmax> viz;
queue<int> q;
ifstream w("maxflow.in");
ofstream g("maxflow.out");
void citeste(){
w>>n>>m;
for(int i=1; i<=m; ++i){
int x, y, z;
w>>x>>y>>z;
gf[x].push_back(y);
gf[y].push_back(x);
c[x][y] += z;
}
}
int minim(int x, int y){
if (x > y) return y;
return x;
}
int bfs(){
for(int i=0; i<=n+1; ++i) viz[i] = 0;
viz[1] = 1;
q.push(1);
for(; q.size(); q.pop()){
int nod = q.front();
if (nod == n) continue;
for(unsigned i=0; i<gf[nod].size(); ++i){
int vecin = gf[nod][i];
if (c[nod][vecin] == f[nod][vecin] || viz[vecin]== 1) continue;
viz[vecin] = 1;
t[vecin] = nod;
q.push(vecin);
}
}
return viz[n];
}
void rezolva(){
for(f_max=0; bfs(); ){
for(unsigned i=0; i<gf[n].size(); ++i){
int vecin = gf[n][i];
if (f[vecin][n] == c[vecin][n] || viz[vecin]==0) continue;
t[n] = vecin;
f_min = 0x3f3f;
for(int i=n; i!=1; i=t[i]){
f_min = minim(f_min, c[ t[i] ][i] - f[ t[i] ][i]);
}
if (f_min == 0) continue;
for(int i=n; i!=1; i=t[i]){
f[ t[i] ][i] += f_min;
}
f_max += f_min;
}
}
g << f_max << "\n";
}
int main(){
citeste();
rezolva();
w.close();
g.close();
return 0;
}