Pagini recente » Cod sursa (job #3204587) | Cod sursa (job #3186458) | Cod sursa (job #2683915) | Cod sursa (job #285146) | Cod sursa (job #2469626)
// o facusem dar aveam dimul prea mic
#include <iostream>
#include <fstream>
#include <vector>
#include <string.h>
#include <queue>
#define DIM 5010
using namespace std;
vector<int> v[DIM];
queue<int> coada;
int n,m,x,y,z,minim,flux,nod,p,u,cap[DIM][DIM],sursa[DIM],a[DIM],v2[DIM][DIM],g;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int bfs(){
g=0;
memset(a,0,DIM);
a[1]=1;
coada.push(1);
while (!coada.empty()){
nod=coada.front();
for (int i=0;i<v[nod].size();i++){
int vecin=v[nod][i];
if (!a[vecin]&&cap[nod][vecin]>v2[nod][vecin]){
coada.push(vecin);
sursa[vecin]=nod;
a[vecin]=1;
if(vecin==n)
g=1;
}
}
coada.pop();
}
return g;
}
int main (){
fin>>n>>m;
for (int i=1;i<=m;i++){
fin>>x>>y>>z;
v[x].push_back(y);
v[y].push_back(x);
cap[x][y]=z;
}
while (bfs()){
for (int i=0;i<v[n].size();i++){
p=v[n][i];
if(cap[p][n]>v2[p][n]&&a[p]){
minim=cap[p][n]-v2[p][n];
u=p;
while(sursa[u]!=0){
minim=min(minim,cap[sursa[u]][u]-v2[sursa[u]][u]);
u=sursa[u];
}
flux+=minim;
v2[p][n]+=minim,v2[n][p]-=minim;
u=p;
while(sursa[u]!=0){
v2[sursa[u]][u]+=minim,v2[u][sursa[u]]-=minim;
u=sursa[u];
}
}
}
}
fout<<flux;
}