Pagini recente » Cod sursa (job #748095) | Cod sursa (job #2299711) | Cod sursa (job #1343139) | Cod sursa (job #710907) | Cod sursa (job #2470165)
#include <fstream>
#include <vector>
#include <deque>
#include <bitset>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m, i, j, t[1001], flux[1001][1001], cap[1001][1001], sol, a, b, c, tata, minim, nod;
deque<int> coada;
vector<int> v[1002];
bitset<1001> f;
bool bfs(){
coada.push_back(1);
f.reset();
f[1] = 1;
t[1] = 0;
while(!coada.empty()){
int p = coada[0];
for(int i = 0;i<v[p].size();i++){
int vecin = v[p][i];
if(f[vecin] == 0 && cap[p][vecin] > flux[p][vecin]){
f[vecin] = 1;
t[vecin] = p;
coada.push_back(vecin);
}
}
coada.pop_front();
}
return f[n];
}
int main(){
fin>>n>>m;
for(i=1;i<=m;i++){
fin>>a>>b>>c;
v[a].push_back(b);
v[b].push_back(a);
cap[a][b] = c;
}
while(bfs()){
for(i=0;i<v[n].size();i++){
b = v[n][i];
if(f[b] == 1 && cap[b][n] > flux[b][n]){
tata = b, nod = n, minim = cap[tata][nod] - flux[tata][nod];
while(tata){
minim = min(minim, cap[tata][nod] - flux[tata][nod]);
nod = tata;
tata = t[nod];
}
tata = b, nod = n;
if(minim != 0){
while(tata){
flux[tata][nod] += minim;
flux[nod][tata] -= minim;
nod = tata;
tata = t[nod];
}
}
sol += minim;
}
}
}
fout<<sol;
return 0;
}