Pagini recente » Cod sursa (job #2622940) | Cod sursa (job #1043846) | Cod sursa (job #1888440) | Cod sursa (job #824196) | Cod sursa (job #1688074)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define nmax 1024
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector <int> V[nmax];
vector <int> Viz(nmax,false);
int C[nmax][nmax],F[nmax][nmax],Tata[nmax],n,m;
int bfs(){
queue<int> G;
Viz=vector<int> (nmax,false);
G.push(1);
Viz[1]=true;
bool bun=false;
while(!G.empty()){
int nod=G.front();
G.pop();
if(nod==n){
bun=true;
continue;
}
for(int i=0;i<V[nod].size();i++){
int x=V[nod][i];
if(Viz[x] || C[nod][x]==F[nod][x]) continue;
Tata[x]=nod;
Viz[x]=true;
G.push(x);
}
}
if(bun){
return 1;
}
return 0;
}
void read(){
int a,b,c;
f>>n>>m;
while(m--){
f>>a>>b>>c;
C[a][b]+=c;
V[a].push_back(b);
V[b].push_back(a);
}
}
int main()
{
read();
int flux=0;
while(bfs()){
for(int i=0;i<V[n].size();i++){
Tata[n]=V[n][i];
int nod=V[n][i];
if(!Viz[nod] || C[nod][n]==F[nod][n]) continue;
int minim=2222222;
int start=n;
for(start=n;start!=1;start=Tata[start]){
minim=min(minim,C[Tata[start]][start]-F[Tata[start]][start]);
}
if(minim==0) continue;
flux+=minim;
for(start=n;start!=1;start=Tata[start]){
F[Tata[start]][start]+=minim;
F[start][Tata[start]]-=minim;
}
}
}
g<<flux;
return 0;
}