Pagini recente » Cod sursa (job #533979) | Cod sursa (job #1994857) | Cod sursa (job #2744714) | Cod sursa (job #398949) | Cod sursa (job #1008006)
#include<cstring>
#include <iostream>
#include<fstream>
#include<vector>
#define Nmax 1024
#define oo 0x3f3f3f3f
using namespace std;
ifstream eu("maxflow.in");
ofstream tu("maxflow.out");
int N,M,C[Nmax][Nmax],TT[Nmax],F[Nmax][Nmax],c[Nmax];
bool Use[Nmax];
vector<int>G[Nmax];
int BF()
{
memset(Use,0,sizeof Use);
int k=1;c[k]=1;
for(int i=1;i<=k;i++)
{
int nod=c[i];
if(nod==N)
continue;
for(unsigned int j=0;j<G[nod].size();j++)
{
int vecin=G[nod][j];
if(!Use[vecin]&&C[nod][vecin]-F[nod][vecin]>0)
{
Use[vecin]=true;
TT[vecin]=nod;
c[++k]=vecin;
if(vecin==N)
return true;
}
}
}
return false;
}
int main()
{
int flow,Fmin,a,b,c,nod;
eu>>N>>M;
for(int i=1;i<=M;i++)
{
eu>>a>>b>>c;
C[a][b]+=c;
G[a].push_back(b);
G[b].push_back(a);
}
for(flow=0;BF();)
for(unsigned int i=0;i<G[N].size();i++)
{
nod=G[N][i];
if(!Use[nod]||C[nod][N]==F[nod][N])
continue;
TT[N]=nod;
Fmin=oo;
for(nod=N;nod!=1;nod=TT[nod])
Fmin=min(Fmin,C[TT[nod]][nod]-F[TT[nod]][nod]);
for(nod=N;nod!=1;nod=TT[nod])
{
F[TT[nod]][nod]+=Fmin;
F[nod][TT[nod]]-=Fmin;
}
flow+=Fmin;
}
tu<<flow;
return 0;
}