Pagini recente » Cod sursa (job #2291143) | Cod sursa (job #3126614) | Cod sursa (job #242368) | Cod sursa (job #1771871) | Cod sursa (job #3041050)
#include <fstream>
#include <vector>
#include <queue>
const int NMAX=1005;
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
bool flux();
int dfs(int, int);
vector <int> v[NMAX];
queue <int> c;
int ans, n, m;
int cap[NMAX][NMAX];
int niv[NMAX], mr[NMAX];
int main()
{
int a, b, c, i;
fin>>n>>m;
for(i=1; i<=m; i++)
{
fin>>a>>b>>c;
v[a].push_back(b);
v[b].push_back(a);
cap[a][b]+=c;
}
while(flux());
fout<<ans<<'\n';
return 0;
}
bool flux()
{
int i, val=0, nr, p;
for(i=1; i<=n; i++) mr[i]=niv[i]=0;
c.push(1);
niv[1]=1;
while(!c.empty())
{
p=c.front();
for(auto i:v[p])
{
if(cap[p][i]>0 && niv[i]==0)
{
niv[i]=niv[p]+1;
c.push(i);
}
}
c.pop();
}
if(niv[n]==0) return false;
do
{
nr=dfs(1, 1e9);
val+=nr;
}while(nr);
ans+=val;
return (val!=0);
}
int dfs(int nod, int val)
{
int nr, mc;
if(nod==n || val==0) return val;
while(mr[nod]<int(v[nod].size()))
{
mc=v[nod][mr[nod]++];
if(niv[mc]==niv[nod]+1)
{
nr=dfs(mc, min(val, cap[nod][mc]));
if(nr)
{
cap[nod][mc]-=nr;
cap[mc][nod]+=nr;
return nr;
}
}
}
return 0;
}