Pagini recente » Cod sursa (job #2595020) | Cod sursa (job #1852777) | Cod sursa (job #1371297) | Cod sursa (job #416117) | Cod sursa (job #1827049)
#include <iostream>
#include <fstream>
#include <vector>
int N,M,maxFlow = 0,minFlow;
const int MAX = 1001;
const int INF = 0x3f3f3f3f;
std::fstream f("maxflow.in",std::ios::in);
std::ofstream g("maxflow.out");
std::vector<int> G[MAX];
std::vector<int>::iterator it;
int Cost[MAX][MAX],Q[MAX],Flow[MAX][MAX],path[MAX];
bool viz[MAX];
int BFS();
void citire();
void rezolvare();
int min(int a, int b)
{
return (a>b)?b:a;
}
int main()
{
f>>N>>M;
citire();
rezolvare();
g<<maxFlow;
return 0;
}
void citire()
{
int i,x,y,l;
for(i=1;i<=M;++i)
{
f>>x>>y>>l;
Cost[x][y]+=l;
G[x].push_back(y);
G[y].push_back(x);
}
}
void rezolvare()
{
int nod;
while(BFS())
{
for(it = G[N].begin();it!=G[N].end();++it)
{
nod = *it;
if(Cost[nod][N]>Flow[nod][N] && viz[N])
{
path[N] = nod;
minFlow = INF;
for(nod = N; nod!=1;nod = path[nod])
{
minFlow = min(minFlow,Cost[path[nod]][nod]-Flow[path[nod]][nod]);
}
if(minFlow == 0)continue;
for(nod = N;nod!=1;nod = path[nod])
{
Flow[path[nod]][nod] += minFlow;
Flow[nod][path[nod]] -= minFlow;
}
maxFlow+=minFlow;
}
}
}
}
int BFS()
{
int i,nod;
viz[1] = 1;
Q[0] = 1;
Q[1] = 1;
for(i=1;i<=N;++i)viz[i] = 0;
for(i=1;i<=Q[0];++i)
{
if(Q[i]==N)continue;
nod = Q[i];
for(it = G[nod].begin();it != G[nod].end();++it)
{
if(Cost[nod][*it]>Flow[nod][*it] && !viz[*it])
{
viz[*it] = 1;
path[*it] = nod;
Q[++Q[0]] = *it;
}
}
}
return viz[N];
}