Pagini recente » Cod sursa (job #2902466) | Cod sursa (job #1444135) | Cod sursa (job #1171549) | Cod sursa (job #353707) | Cod sursa (job #415437)
Cod sursa(job #415437)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int n,m,minim,f=0;
bool k=0;
vector < pair <int,int> > a[1020];
int coada[1020],marc[1020],pred[1020];
int fl[1020][1020];
const int inf=1<<30;
int flux()
{
memset(marc,0,sizeof(marc));
memset(coada,0,sizeof(coada));
memset(pred,0,sizeof(pred));
coada[1]=1;
int r=1,p;
minim=inf;
for (p=1;p<=r;++p)
{
for (int i=0;i<a[coada[p]].size();++i)
{
int cost=a[coada[p]][i].second-fl[coada[p]][a[coada[p]][i].first];
if (cost>0&&!marc[a[coada[p]][i].first])
{
marc[a[coada[p]][i].first]=1;
coada[++r]=a[coada[p]][i].first;
pred[a[coada[p]][i].first]=coada[p];
}
}
}
if (!pred[n])
return 0;
int i=n;
while (i!=1)
{
int j;
for (j=0;a[pred[i]][j].first!=i;++j);
int cost=a[pred[i]][j].second-fl[pred[i]][i];
if (cost<minim)
minim=cost;
i=pred[i];
}
i=n;
while (i!=1)
{
fl[pred[i]][i]+=minim;
fl[i][pred[i]]-=minim;
i=pred[i];
}
f+=minim;
return minim;
}
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(make_pair(y,z));
a[y].push_back(make_pair(x,0));
}
while (flux());
printf("%d",f);
return 0;
}