Pagini recente » Cod sursa (job #2477993) | Cod sursa (job #1119020) | Cod sursa (job #375372) | Cod sursa (job #2365943) | Cod sursa (job #1134703)
#include<fstream>
#include<vector>
#include<list>
#include<cstring>
#include<algorithm>
#define DMAX 1001
#define INF 21000000
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout("maxflow.out");
list<int> lista;
list<int>::iterator it;
vector< list<int> >l(DMAX,lista);
int n,m,i,x,y,c,flxmin,flux,nod;
int cap[DMAX][DMAX],flx[DMAX][DMAX],viz[DMAX],que[DMAX],dad[DMAX];
int bf()
{
int ls=0,ld=0,nod;
memset(viz,0,sizeof(viz));
memset(dad,0,sizeof(dad));
que[0]=1; viz[1]=1;
while(ls<=ld)
{
nod=que[ls++];
for(it=l[nod].begin();it!=l[nod].end();++it)
if(cap[nod][*it]>flx[nod][*it] && !viz[*it])
{
if(*it==n)
{
viz[n]=1;
continue;
}
viz[*it]=1;
que[++ld]=*it;
dad[*it]=nod;
}
}
return viz[n];
}
int main()
{
fin>>n>>m;
for(i=0;i<m;++i)
{
fin>>x>>y>>c;
l[x].push_back(y);
l[y].push_back(x);
cap[x][y]=c;
}
while(bf())
{
for(it=l[n].begin();it!=l[n].end();++it)
{
nod=*it;
if(cap[nod][n]<=flx[nod][n] || !viz[nod])
continue;
dad[n]=nod;
flxmin=INF;
for(i=n;i!=1;i=dad[i])
if(flxmin>cap[dad[i]][i]-flx[dad[i]][i])
flxmin=cap[dad[i]][i]-flx[dad[i]][i];
if(flxmin)
{
for(i=n;i!=1;i=dad[i])
{
flx[dad[i]][i]+=flxmin;
flx[i][dad[i]]-=flxmin;
}
flux+=flxmin;
}
}
}
fout<<flux;
return 0;
}