Pagini recente » Cod sursa (job #1871363) | Cod sursa (job #2273843) | Cod sursa (job #1798484) | Cod sursa (job #1395591) | Cod sursa (job #695788)
Cod sursa(job #695788)
#include<stdio.h>
#include<vector>
#define infile "maxflow.in"
#define outfile "maxflow.out"
#define nmax 1024
#define inf 0x0fffffff
using namespace std;
long cap[nmax][nmax]; //capacitatea maxima pe muchia i,j
long flx[nmax][nmax]; // fluxul pe muchia i,j
long nrv[nmax]; //numarul vecinilor nodului i
long viz[nmax]; // starea elementului i
long n,m;//nr noduri ,nr muchii
long tt[nmax]; //tatal nodului i
long cd[nmax]; //coada
vector<long> v[nmax]; //vecinii nodului i
long vmin( long a,long b)
{
if (a>b)
return b;
return a;
}
void read()
{
int x,y,z;
scanf("%ld %ld",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%ld %ld %ld",&x,&y,&z);
cap[x][y]=z;
nrv[x]++;
nrv[y]++;
v[x].push_back(y);
v[y].push_back(x);
}
}
int bf()
{
int nod,vc;
cd[0]=1;
cd[1]=1;
for(int i=1;i<=n;i++)
viz[i]=0;
for(int i=1;i<=cd[0];i++)
{
nod=cd[i];
for(int j=0;j<nrv[nod];j++)
{
vc=v[nod][j];
if(cap[nod][vc]==flx[nod][vc] || viz[vc])
continue;
viz[vc]++;
cd[++cd[0]]=vc;
tt[vc]=nod;
if(vc==n)
return 1;
}
}
return 0;
}
int main()
{
int flux,s=0,fmin;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
while(bf())
{
fmin=inf;
for(int i=n;i!=1;i=tt[i])
{
fmin=vmin(fmin , cap[tt[i]][i]-flx[tt[i]][i]);
}
for(int i=n;i!=1;i=tt[i])
{
flx[tt[i]][i]+=fmin;
flx[i][tt[i]]-=fmin;
}
s+=fmin;
}
printf("%ld",s);
fclose(stdin);
fclose(stdout);
return 0;
}