Pagini recente » Cod sursa (job #1796822) | Cod sursa (job #2831917) | Cod sursa (job #2028111) | Cod sursa (job #2290993) | Cod sursa (job #2524501)
#include <bits/stdc++.h>
#define Inf 2000000001
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n,m;
vector <int> gf[1001];
int cap[1001][1001],flow[1001][1001];
bitset <1001> viz;
queue <int> c;
int tree[1001];
int frunza[1001];
int drum[1001];
int sum;
bool bfs()
{
for(int i=1;i<=n;i++)
{
viz[i]=0;
frunza[i]=0;
}
c.push(1);
viz[1]=1;
while(!c.empty())
{
int nod=c.front();
c.pop();
if(nod==n)
continue;
frunza[nod]=1;
for(auto vec:gf[nod])
if(viz[ vec ]==0 && cap[nod][vec]-flow[nod][vec]>0)
{
viz[vec]=1;
tree[vec]=nod;
c.push(vec);
if(vec!=n)
frunza[nod]=0;
}
}
for(int i=1;i<=n-1;i++)
if(frunza[i] && cap[i][n]-flow[i][n]==0)
frunza[i]=0;
return viz[n];
}
int main()
{
in>>n>>m;
for(int i,j,cp,k=1;k<=m;k++)
{
in>>i>>j>>cp;
gf[i].push_back(j);
cap[i][j]=cp;
}
while(bfs()==true)
{
for(int i=1;i<=n-1;i++)
if(frunza[i])
{
int t=0,poz=i;
drum[++t]=n;
while(poz)
{
drum[++t]=poz;
poz=tree[poz];
}
int minim=Inf;
for(int i=1;i<t;i++)
minim=min(minim,cap[ drum[i+1] ][ drum[i] ]-flow[ drum[i+1] ][ drum[i] ]);
for(int i=1;i<t;i++)
flow[ drum[i+1] ][ drum[i] ]+=minim;
sum+=minim;
}
}
out<<sum;
return 0;
}