Pagini recente » Cod sursa (job #1577716) | Cod sursa (job #1653207) | Cod sursa (job #1600325) | Cod sursa (job #2731371) | Cod sursa (job #1119560)
#include <fstream>
#include <vector>
#include <list>
#include <queue>
#include <limits>
const unsigned UINF=std::numeric_limits<unsigned>::max();
int main(){
std::ifstream fin("maxflow.in");
std::ofstream fout("maxflow.out");
unsigned n,m; fin>>n>>m;
std::vector< std::vector<unsigned> > F(n+1,std::vector<unsigned>(n+1));
std::vector< std::list<unsigned> > Adj(n+1);
for(unsigned i=0;i<m;++i){
unsigned x,y,z;
fin>>x>>y>>z;
Adj[x].push_back(y);
Adj[y].push_back(x);
F[x][y]=z;
}
unsigned maxflow=0;
bool drum_gasit=true;
while(drum_gasit){
drum_gasit=false;
//urmeaza un BFS...
std::vector<int> tata(n+1,-1);
std::list<unsigned> bfq;
bfq.push_back(1); tata[1]=0;
while(!bfq.empty()){
unsigned t=bfq.front(); bfq.pop_front();
for(auto it=Adj[t].begin();it!=Adj[t].end();++it){
if(*it==n&&F[t][n]>0){
drum_gasit=true;
unsigned currflux=UINF;
tata[n]=t;
for(unsigned i=n;i!=1;i=tata[i])
if(F[tata[i]][i]<currflux) currflux=F[tata[i]][i];
if(currflux)
for(unsigned i=n;i!=1;i=tata[i]){
F[tata[i]][i]-=currflux;
F[i][tata[i]]+=currflux;
}
maxflow+=currflux;
}
if(tata[*it]==-1&&F[t][*it]>0){
bfq.push_back(*it);
tata[*it]=t;
}
}
}
}
fout<<maxflow<<'\n';
}