Pagini recente » Cod sursa (job #146106) | Cod sursa (job #28593) | Cod sursa (job #963426) | Cod sursa (job #3182291) | Cod sursa (job #2984445)
/*
pe cuvantul meu ca eu submitat codul
de pe contul razvanalexrotaru
sa nu credeti ca am copiat!
*/
#include <fstream>
#include <vector>
#include <queue>
const int NMAX=1005;
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <int> v[NMAX];
int cap[NMAX][NMAX];
bool flux();
int dfs(int, int);
long long ans;
int mr[NMAX], niv[NMAX];
int n, m, s, d;
queue <int> c;
int main()
{
int i, a, b, c;
fin>>n>>m;
s=1;
d=n;
for(i=1; i<=m; i++)
{
fin>>a>>b>>c;
cap[a][b]=c;
v[a].push_back(b);
v[b].push_back(a);
}
while(flux());
fout<<ans<<'\n';
return 0;
}
bool flux()
{
int i, p, x, val=0;
for(i=1; i<=n; i++)
{
mr[i]=0;
niv[i]=-1;
}
niv[s]=0;
c.push(s);
while(!c.empty())
{
p=c.front();
for(auto i:v[p])
{
if(cap[p][i]>0 && niv[i]==-1)
{
niv[i]=niv[p]+1;
c.push(i);
}
}
c.pop();
}
if(niv[d]==-1) return 0;
while(true)
{
x=dfs(s, int(1e9));
if(x==0) break;
val+=x;
}
ans+=val;
return (val!=0);
}
int dfs(int nod, int val)
{
int i, x;
if(nod==d || val==0) return val;
while(mr[nod]<int(v[nod].size()))
{
i=v[nod][mr[nod]++];
if(cap[nod][i]>0&& niv[i]==niv[nod]+1)
{
x=dfs(i, min(cap[nod][i], val));
if(x>0)
{
cap[nod][i]-=x;
cap[i][nod]+=x;
return x;
}
}
}
return 0;
}