Pagini recente » Cod sursa (job #2659508) | Cod sursa (job #2890447) | Cod sursa (job #2988512) | Cod sursa (job #1289508) | Cod sursa (job #2971883)
#include <fstream>
#include <queue>
#include <map>
#include <vector>
const int NMAX=1005;
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
void niv(int);
int dfs(int, int);
map< pair< int, int >, int > f;
vector <int> v[NMAX];
int lvl[NMAX];
bool de[NMAX];
int n, m, r;
int main()
{
int i, x, y, z;
fin>>n>>m;
for(i=1; i<=m; i++)
{
fin>>x>>y>>z;
v[x].push_back(y);
f[{x, y}]=z;
if(!f[{y, x}]) v[y].push_back(x);
}
niv(1);
while(lvl[n])
{
x=1;
while(x)
{
x=dfs(1, 1e9);
r+=x;
}
niv(1);
}
fout<<r<<'\n';
return 0;
}
void niv(int nod)
{
int i;
queue <int> q;
for(i=1; i<=n; i++)
{
lvl[i]=0;
de[i]=false;
}
lvl[nod]=1;
q.push(nod);
while(!q.empty())
{
nod=q.front();
for(auto i:v[nod])
{
if(!lvl[i] && f[{nod, i}]>0)
{
lvl[i]=lvl[nod]+1;
q.push(i);
}
}
q.pop();
}
}
int dfs(int nod, int mini)
{
int x;
if(nod==n) return mini;
for(auto i:v[nod])
{
if(lvl[i]==lvl[nod]+1 && !de[i] && f[{nod, i}]>0)
{
x=dfs(i, min(mini, f[{nod, i}]));
if(x)
{
f[{nod, i}]-=x;
f[{i, nod}]+=x;
return x;
}
else de[i]=true;
}
}
return 0;
}