Pagini recente » Cod sursa (job #1728785) | Cod sursa (job #2649015) | Cod sursa (job #488106) | Cod sursa (job #3042050) | Cod sursa (job #1467800)
#include <fstream>
#include <vector>
#include <bitset>
#define MAX_NOD 1003
#define INF 1000200200
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
struct _flows{int limit,actual;};
struct _vecin{int nod,leg;};
struct coada{int nod,ant,muchie,flow;} co[MAX_NOD];
struct nod{vector<_vecin> vecini; vector<_flows> flows;} mat[MAX_NOD];
int maxFlow, n, m, x, y, z;
bitset<MAX_NOD> viz;
void callback(int poz)
{
int nod;
int flow = co[poz].flow;
maxFlow += co[poz].flow;
while(poz!=1)
{
nod = co[co[poz].ant].nod;
mat[nod].flows[co[poz].muchie].actual += flow;
mat[co[poz].nod].flows[mat[nod].vecini[co[poz].muchie].leg].actual-=flow;
poz = co[poz].ant;
}
}
bool bfs()
{
int inc = 1, sf = 1;
nod _nod;
co[inc].nod=1; co[inc].ant=0; co[inc].muchie = -1; co[inc].flow=INF;
for(int i=1;i<=n;i++)
viz[i]=0;
viz[1]=1;
while(inc<=sf)
{
_nod = mat[co[inc].nod];
for(int i=0;i<_nod.vecini.size();i++)
if(viz[_nod.vecini[i].nod]==0 && _nod.flows[i].actual<_nod.flows[i].limit)
{
co[++sf].nod = _nod.vecini[i].nod;
co[sf].ant = inc;
co[sf].muchie = i;
co[sf].flow = _nod.flows[i].limit-_nod.flows[i].actual > co[inc].flow ? co[inc].flow : _nod.flows[i].limit-_nod.flows[i].actual;
if(co[sf].nod == n)
{
callback(sf);
return 1;
}
}
inc++;
}
return 0;
}
int main()
{
fin>>n>>m;
_flows flow;
_vecin vecin;
flow.actual = 0;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>z;
vecin.nod = y; vecin.leg = mat[y].vecini.size();
mat[x].vecini.push_back(vecin);
flow.limit = z;
mat[x].flows.push_back(flow);
vecin.nod = x; vecin.leg = mat[x].vecini.size()-1;
mat[y].vecini.push_back(vecin);
flow.limit = 0;
mat[y].flows.push_back(flow);
}
while(bfs());
fout<<maxFlow;
return 0;
}