Pagini recente » Cod sursa (job #1361685) | Cod sursa (job #358992) | Cod sursa (job #739433) | Cod sursa (job #126316) | Cod sursa (job #984136)
Cod sursa(job #984136)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>
#include <bitset>
using namespace std;
int C[1005][1005],n,m,sol,prec[5005];
vector <int> v[1005];
bitset <1005> apar;
int bfs()
{
int i,nod,nodc;
for (i=0;i<=5002;i++) prec[i]=0;
for (i=0;i<=1005;i++) apar[i]=0;
queue <int> q;
q.push(1);
apar[1]=1;
while (!q.empty())
{
nod=q.front();
q.pop();
for (i=0;i<v[nod].size();i++)
{
nodc=v[nod][i];
if (!apar[nodc])
if (C[nod][nodc]>0)
{
prec[nodc]=nod;
apar[nodc]=1;
if (nodc!=n)
q.push(nodc);
}
}
}
return apar[n];
}
int main()
{
fstream f,g;
f.open("maxflow.in",ios::in);
g.open("maxflow.out",ios::out);
f>>n>>m;
int i,x,y,c,nodc,nodprec,curent;
for (i=1;i<=m;i++)
{
f>>x>>y>>c;
v[x].push_back(y);
v[y].push_back(x);// graf rezidual
C[x][y]=c;
}
while (bfs())
for (i=0;i<v[n].size();i++)
if (apar[v[n][i]] && C[v[n][i]][n]>0)
{
curent=C[v[n][i]][n];
nodc=v[n][i];
do
{
nodprec=prec[nodc];
curent=min(curent,C[nodprec][nodc]);
nodc=nodprec;
}while (nodc!=1);
sol+=curent;
C[v[n][i]][n]-=curent;
C[n][v[n][i]]+=curent;
nodc=v[n][i];
do
{
nodprec=prec[nodc];
C[nodprec][nodc]-=curent;
C[nodc][nodprec]+=curent;
nodc=nodprec;
}while (nodc!=1);
}
g<<sol;
}