Pagini recente » Cod sursa (job #1009597) | Cod sursa (job #3153231) | Cod sursa (job #1080650) | Cod sursa (job #2478858) | Cod sursa (job #3207026)
#include <fstream>
#include <vector>
#include <queue>
const int NMAX=1005;
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int flux();
int bfs(int);
int dfs(int, int);
queue <int> c;
vector <int> v[NMAX];
int cap[NMAX][NMAX];
int n, m, s, d;
int dist[NMAX], vec[NMAX];
int main()
{
int i, a, b, c;
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;
}
fout<<flux();
return 0;
}
int flux()
{
int ans=0, newc;
s=1; d=n;
while(true)
{
newc=bfs(s);
if(!newc) break;
ans+=newc;
}
return ans;
}
int bfs(int nod)
{
int i, ans=0, p;
for(i=1; i<=n; i++)
{
dist[i]=1e9;
vec[i]=0;
}
c.push(nod); dist[nod]=0;
while(!c.empty())
{
p=c.front();
c.pop();
for(auto i:v[p])
{
if(cap[p][i]>0 && dist[i]>dist[p]+1)
{
dist[i]=dist[p]+1;
c.push(i);
}
}
}
if(dist[d]==1e9) return 0;
while(true)
{
int val=dfs(s, 1e9);
if(val==0) break;
ans+=val;
}
return ans;
}
int dfs(int nod, int minim)
{
if(nod==d || minim==0) return minim;
while(vec[nod]<int(v[nod].size()))
{
if(cap[nod][v[nod][vec[nod]]]>0 && dist[v[nod][vec[nod]]]==dist[nod]+1)
{
int newn=v[nod][vec[nod]];
int val=dfs(newn, min(minim, cap[nod][newn]));
if(val)
{
cap[nod][newn]-=val;
cap[newn][nod]+=val;
return val;
}
else vec[nod]++;
}
else vec[nod]++;
}
return 0;
}