Cod sursa(job #978644)
Utilizator | Data | 29 iulie 2013 13:20:08 | |
---|---|---|---|
Problema | Flux maxim | Scor | 60 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.97 kb |
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
struct la
{
int ind,cap;
la *urm;
} *p,*q;
struct nod
{
la *urm;
} v[1005];
int i,n,m,x,y,c,s,ax;
int f1()
{
int nvl,mn;
struct vectorlee
{
int val,cap,orig;
la *ca;
} vl[1005];
bitset <1005> vb;
for (i=1;i<=n;i++)
{
vb[i]=0;
vl[i].val=vl[i].cap=vl[i].orig=0;
vl[i].ca=NULL;
}
vl[1].val=1;
vb[1]=1;
nvl=1;
for (i=1;i<=nvl;i++)
{
p=v[vl[i].val].urm;
q=NULL;
while (p!=NULL)
{
if (vb[p->ind]==0)
{
nvl++;
vl[nvl].val=p->ind;
vl[nvl].cap=p->cap;
vl[nvl].orig=i;
vl[nvl].ca=q;
vb[p->ind]=1;
if (p->ind==n)
{
i=nvl;
mn=2000000000;
while (i!=1)
{
if (vl[i].cap<mn)
mn=vl[i].cap;
i=vl[i].orig;
}
while (nvl!=1)
{
p=vl[nvl].ca;
if (p!=NULL)
{
p->urm->cap-=mn;
if (p->urm->cap==0)
{
q=p->urm;
p->urm=q->urm;
delete(q);
}
}
else
{
p=v[vl[vl[nvl].orig].val].urm;
p->cap-=mn;
if (p->cap==0)
{
v[vl[vl[nvl].orig].val].urm=p->urm;
}
}
nvl=vl[nvl].orig;
}
return mn;
}
}
q=p;
p=p->urm;
}
}
return 0;
}
int main(void)
{
for (i=0;i<1004;i++)
v[i].urm=NULL;
FILE * f;
f=fopen("maxflow.in","r");
ofstream g("maxflow.out");
fscanf(f,"%d%d",&n,&m);
for (i=1;i<=m;i++)
{
fscanf(f,"%d%d%d",&x,&y,&c);
if (v[x].urm==NULL)
{
p=new(la);
p->ind=y;
p->cap=c;
v[x].urm=p;
p->urm=NULL;
}
else
{
q=v[x].urm;
while (q->urm!=NULL)
q=q->urm;
p=new(la);
p->ind=y;
p->cap=c;
q->urm=p;
p->urm=NULL;
}
}
s=0;
ax=f1();
while (ax!=0)
{
s=s+ax;
ax=f1();
}
g<<s;
g.close();
return 0;
}