Pagini recente » Cod sursa (job #1347809) | Cod sursa (job #1335557) | Cod sursa (job #1761397) | Cod sursa (job #2169125) | Cod sursa (job #913112)
Cod sursa(job #913112)
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 1005
#define inf (1<<30)
int x, y, z, n, m, rez, nbf, el, inc, sf, i, nod, fmin, ii, nt;
int cap[nmax][nmax], viz[nmax], co[nmax], t[nmax], tn[nmax];
vector <int> ma[nmax];
vector <int> ::iterator it;
void citire()
{
scanf("%d %d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&z);
ma[x].push_back(y);
ma[y].push_back(x);
cap[x][y]=z;
}
}
void bfs()
{
co[1]=1; inc=sf=1; nbf++; nt=0;
while (inc<=sf)
{
el=co[inc]; inc++;
for (it=ma[el].begin();it!=ma[el].end();it++)
if (cap[el][*it]>0)
if (viz[*it]<nbf)
{
viz[*it]=nbf; t[*it]=el;
co[++sf]=*it;
if (*it==n)
tn[++nt]=el;
}
}
}
void rezolvare()
{
while (1)
{
bfs();
if (viz[n]==nbf)
{
for (ii=1;ii<=nt;ii++)
{
t[n]=tn[ii];
nod=n; fmin=inf;
while (nod>1)
{
if (fmin>cap[t[nod]][nod])
fmin=cap[t[nod]][nod];
if (fmin==0)
break;
nod=t[nod];
}
nod=n;
if (fmin>0)
while (nod>1)
{
cap[t[nod]][nod]-=fmin;
cap[nod][t[nod]]+=fmin;
nod=t[nod];
}
rez+=fmin;
}
}
else
break;
}
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
citire();
rezolvare();
printf("%d",rez);
return 0;
}