Pagini recente » Borderou de evaluare (job #984311) | Borderou de evaluare (job #1409087) | Borderou de evaluare (job #2178749) | Cod sursa (job #1970479) | Cod sursa (job #915561)
Cod sursa(job #915561)
#include <cstdio>
#include <vector>
using namespace std;
vector< vector <int> > much;
vector< vector <int> > capacit;
vector< vector <int> > cpycap;
int dim[1001];
int n,m;
int flux,vmax=1<<30;
void citire()
{
freopen("maxflow.in","r",stdin);
scanf("%d%d",&n,&m);
int v1,v2,fl;
much.resize(n+1);
capacit.resize(n+1);
cpycap.resize(n+1);
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&v1,&v2,&fl);
much[v1].push_back(v2);
much[v2].push_back(v1);
capacit[v1].push_back(fl);
capacit[v2].push_back(0);
cpycap[v1].push_back(fl);
cpycap[v2].push_back(0);
dim[v1]++;
dim[v2]++;
}
}
void maxfl()
{
while(1)
{
int c[1001],ant[1001]={0};
int inc,sf;
int vmin,nc;
inc=sf=1;
c[1]=1;
ant[1]=-1;
while(inc<=sf)
{
for(int i=0;i<dim[c[inc]];++i)
if(ant[much[c[inc]][i]]==0&&capacit[c[inc]][i]>0)
{
ant[much[c[inc]][i]]=c[inc];
c[++sf]=much[c[inc]][i];
}
++inc;
}
if(ant[n]==0)
break;
vmin=vmax;
nc=n;
while(nc!=1)
{
int vc;
for(int i=0;i<dim[ant[nc]];++i)
if(much[ant[nc]][i]==nc)
{
vc=capacit[ant[nc]][i];
break;
}
if(vc<vmin)
vmin=vc;
nc=ant[nc];
}
flux+=vmin;
nc=n;
while(nc!=1)
{
int vc;
for(int i=0;i<dim[ant[nc]];++i)
if(much[ant[nc]][i]==nc)
{
vc=i;
break;
}
capacit[ant[nc]][vc]-=vmin;
for(int i=0;i<dim[nc];++i)
if(much[nc][i]==ant[nc])
{
vc=i;
break;
}
capacit[nc][vc]+=vmin;
nc=ant[nc];
}
}
}
void afis()
{
freopen("maxflow.out","w",stdout);
printf("%d\n",flux);
fclose(stdout);
}
int main()
{
citire();
maxfl();
afis();
return 0;
}