Pagini recente » Cod sursa (job #509481) | Cod sursa (job #1328735) | Cod sursa (job #158661) | Cod sursa (job #251270) | Cod sursa (job #417820)
Cod sursa(job #417820)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int n,m,minim,f=0;
vector < int > a[1020],dest;
int coada[1020],pred[1020];
int cap[1020][1020];
const int inf=1<<30;
int flux()
{
memset(coada,0,sizeof(coada));
memset(pred,0,sizeof(pred));
coada[1]=1;
int r=1,p;
for (p=1;p<=r;++p)
{
for (int i=0;i<a[coada[p]].size();++i)
{
if (cap[coada[p]][a[coada[p]][i]]>0&&!pred[a[coada[p]][i]])
{
coada[++r]=a[coada[p]][i];
pred[a[coada[p]][i]]=coada[p];
}
}
}
if (!pred[n])
return 0;
int aux=f;
for (int k=0;k<dest.size();++k)
{
int i=dest[k];
if (!pred[i]||!cap[i][n])
continue;
minim=inf;
while (i!=1)
{
if (cap[pred[i]][i]<minim)
minim=cap[pred[i]][i];
i=pred[i];
}
i=dest[k];
if (minim>cap[i][n])
minim=cap[i][n];
cap[i][n]-=minim;
cap[n][i]+=minim;
while (i!=1)
{
cap[pred[i]][i]-=minim;
cap[i][pred[i]]+=minim;
i=pred[i];
}
f+=minim;
}
if (aux==f)
return 0;
return 1;
}
int main()
{
freopen ("maxflow.in","r",stdin);
freopen ("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
int x,y,z;
for (int i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
a[x].push_back(y);
a[y].push_back(x);
cap[x][y]=z;
if (y==n)
dest.push_back(x);
}
while (flux());
printf("%d",f);
return 0;
}