Pagini recente » Diferente pentru autumn-warmup-2007/solutii/runda-2 intre reviziile 7 si 8 | Monitorul de evaluare | Cod sursa (job #1963521) | Cod sursa (job #353129) | Cod sursa (job #1467874)
#include <fstream>
#include <vector>
#include <cstdlib>
#include <memory.h>
#define NMAX 10001
#define INF 10002000
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int C[NMAX][NMAX],F[NMAX][NMAX];
int x,y,z,n,m,flux,fluxMin,nod , viz[NMAX], ANT[NMAX];
vector<int> G[NMAX];
int co[NMAX];
bool BFS()
{
int sf=1 , inc=1;
memset(viz,0,sizeof(viz));
viz[1]= 1; co[1] = 1;
while(inc<=sf)
{
nod = co[inc];
if(nod == n ) return 1;
for(int i=0;i<G[nod].size();i++)
{
if(viz[G[nod][i]] || C[nod][G[nod][i]] == F[nod][G[nod][i]]) continue;
viz[G[nod][i]] = 1;
co[++sf] = G[nod][i];
ANT[G[nod][i]] = nod;
}
inc++;
}
return 0;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>z;
C[x][y]=z;
G[x].push_back(y);
G[y].push_back(x);
}
while(BFS())
for(int i=0;i<G[n].size();i++)
{
nod = G[n][i];
if(!viz[nod] || C[G[n][i]][n] == F[G[n][i]][n]) continue;
ANT[n]=nod;
fluxMin = INF;
for(int i = nod; i>1; i=ANT[i])
fluxMin = min(fluxMin , C[ANT[i]][i] - F[ANT[i]][i]);
if(fluxMin==0) continue;
for(int i = nod; i>1; i=ANT[i])
{
F[ANT[i]][i] += fluxMin;
F[i][ANT[i]] -= fluxMin;
}
flux += fluxMin;
}
fout<<flux<<'\n';
return 0;
}