Cod sursa(job #765473)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 iulie 2012 20:27:46
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<cstdio>
#include<cstring>
#define N 1001
int cap[N][N],p,q,c,n,m,t[N],mn;
struct nod 
{int x; 
nod *n;};
nod *a[N],*r;

int A()
{int Q[N],p=0,q=0,d[N],v;
bool u[N];
memset(u,0,sizeof(u)),memset(t,0,sizeof(t)),memset(d,0,sizeof(d));
u[1]=Q[0]=1;
while(p<=q)
    {v=Q[p++];
    for(nod *i=a[v];i;i=i->n)
    if(!u[i->x]&&cap[v][i->x]>0)
          {Q[++q]=i->x,u[i->x]=1;
          t[i->x]=v,d[i->x]=d[v]+1;}}
return t[n]!=0;}

void B()
{int flow=0,j;
while(A())
    {for(nod *i=a[n];i;i=i->n) 
    if(t[i->x]) 
          {mn=0x3f3f3f3f;
          for(j=i->x;t[j];j=t[j])
          if(mn>cap[t[j]][j])
               mn=cap[t[j]][j];
          if(mn>cap[i->x][n])
               mn=cap[i->x][n];
          if(mn<=0) 
               continue;
          cap[i->x][n]-=mn,cap[n][i->x]+=mn;
          for(j=i->x;t[j];j=t[j])
               cap[t[j]][j]-=mn,cap[j][t[j]]+=mn;
          flow+=mn;}}
printf("%d\n",flow);}

int main()
{freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
while(m--)
      {scanf("%d%d%d",&p,&q,&c);
      r=new nod,r->x=q,r->n=a[p],a[p]=r;
      r=new nod,r->x=p,r->n=a[q],a[q]=r,cap[p][q]=c;}
B();
return 0;}