Pagini recente » Cod sursa (job #1581166) | Cod sursa (job #742114) | Cod sursa (job #334255) | Cod sursa (job #203795) | Cod sursa (job #2524575)
#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],tree[1001];
int cap[1001][1001],flow[1001][1001];
bitset <1001> viz;
queue <int> c;
int drum[1001];
int sum;
bool bfs()
{
for(int i=1;i<=n;i++)
{
viz[i]=0;
if(tree[i].size())
tree[i].resize(0);
}
viz[1]=1;
c.push(1);
while(!c.empty())
{
int nod=c.front();
c.pop();
for(auto vec:gf[nod])
if(vec==n && cap[nod][n]-flow[nod][n]>0)
{
tree[nod].push_back(n);
viz[n]=1;
}
else if(!viz[vec] && cap[nod][vec]-flow[nod][vec]>0)
{
tree[nod].push_back(vec);
viz[vec]=1;
c.push(vec);
}
}
return viz[n];
}
void updateFlow(int t)
{
int minim=Inf;
for(int i=1;i<t;i++)
minim=min(minim,cap[ drum[i] ][ drum[i+1] ]-flow[ drum[i] ][ drum[i+1] ]);
for(int i=1;i<t;i++)
flow[ drum[i] ][ drum[i+1] ]+=minim;
sum+=minim;
}
bool dfs(int nod=1,int poz=1)
{
drum[poz]=nod;
if(nod==n)
{
updateFlow(poz);
return true;
}
bool found=0;
for(auto vec:tree[nod])
if(cap[nod][vec]-flow[nod][vec]>0)
{
found=dfs(vec,poz+1);
if(found)
return true;
}
}
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)
while(dfs()==true);
out<<sum;
}