Pagini recente » Cod sursa (job #2259014) | Cod sursa (job #50939) | Cod sursa (job #3139916) | Cod sursa (job #19519) | Cod sursa (job #2244512)
#include <fstream>
#include <cstring> //memset
#include <vector>
std::ifstream cin("maxflow.in");
std::ofstream cout("maxflow.out");
#define maxn 1050
#define min(a,b) a<b?a:b
using namespace std;
vector<int> adj[maxn];
int C[maxn][maxn],F[maxn][maxn], ant[maxn], viz[maxn],TT[maxn];
int N,M,Fmax;
int BF_Edmons(){
ant[0]=1;
ant[1]=1;
memset(viz,0,sizeof(viz));
viz[1]=1;
for(int i=0;i<=ant[0];i++){
int nod=ant[i];
if(nod==N)
continue;
for(unsigned int i=0;i<adj[nod].size();i++){
int dest=adj[nod][i];
if(viz[dest]||C[nod][dest]==F[nod][dest])
continue;
ant[++ant[0]]=dest;
TT[dest]=nod;
viz[dest]=1;
}
}
return viz[N];
}
int main()
{
int x,y,c,mflux;
cin>>N>>M;
for(;M--;){
cin>>x>>y>>c;
adj[x].push_back(y);
adj[y].push_back(x);
C[x][y]+=c;
}
for(Fmax=0;BF_Edmons();)
for(unsigned int i=0;i<adj[N].size();i++){
int nod=adj[N][i];
if(C[nod][N]==F[nod][N])
continue;
ant[N]=nod;
mflux=0;
for(int wh=N;wh!=1;wh=ant[wh])
mflux=min(mflux, C[nod][wh]-F[nod][wh]);
if(mflux==0)
continue;
for(int wh=N;wh!=1;wh=ant[wh]){
F[nod][wh]+=mflux;
F[wh][nod]-=mflux;
}
Fmax+=mflux;
}
cout<<Fmax;
}