Pagini recente » Cod sursa (job #2194782) | Cod sursa (job #712786) | Rating Nicula Ionut (nionutWH) | Cod sursa (job #1385652) | Cod sursa (job #2487486)
#include <bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,i,tata[1005],cap[1005][1005],flow[1005][1005];
vector <int> v[1005];
bool exista_drum(int start)
{
int i,nod,nr;
queue <int> q;
for (i=1;i<=n;i++)
{
tata[i]=-1;
}
q.push(start);
tata[start]=0;
while (!q.empty())
{
nr=q.front();
q.pop();
for (i=0;i<v[nr].size();i++)
{
nod=v[nr][i];
if (tata[nod]==-1&&cap[nr][nod]!=flow[nr][nod])
{
tata[nod]=nr;
if (nod==n)
{
return 1;
}
q.push(nod);
}
}
}
return 0;
}
int m,x,y,z,it,sol;
long long ans;
int main()
{
f>>n>>m;
for (i=1;i<=m;i++)
{
f>>x>>y>>z;
cap[x][y]=z;
flow[x][y]=flow[y][x]=0;
v[y].push_back(x);
v[x].push_back(y);
}
while (exista_drum(1))
{
for (i=0;i<v[n].size();i++)
{
it=v[n][i];
if (tata[it]==-1)continue;
int nod=it;
int sol=cap[nod][n]-flow[nod][n];
while (tata[nod]>0)
{
sol=min(sol,cap[tata[nod]][nod]-flow[tata[nod]][nod]);
nod=tata[nod];
}
flow[it][n]+=sol;
flow[n][it]-=sol;
nod=it;
ans+=sol;
while (tata[nod]>0)
{
flow[tata[nod]][nod]+=sol;
flow[nod][tata[nod]]-=sol;
nod=tata[nod];
}
}
}
g<<ans;
return 0;
}