Cod sursa(job #362984)

Utilizator irene_mFMI Irina Iancu irene_m Data 11 noiembrie 2009 14:42:58
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <cstdio>
#include <string>
#include <math.h>
#define MaxN 1010
#define MAX 0x3f3f3f3f

struct muchie{
      int x;
      muchie *urm;
};

muchie *G[MaxN],*W[MaxN];

int a[MaxN][MaxN],b[MaxN][MaxN],s[MaxN],N,st,f,sw=1,min,nr,uz[MaxN];

void add(int x,int y)
{
      muchie *aux=new muchie;
      aux->x=y; aux->urm=G[x];
      G[x]=aux;
}

void cit()
{
      int i,x,y,c,M;
      freopen("maxflow.in","r",stdin);
      scanf("%d%d",&N,&M);
      st=1; f=N;
      for(i=1;i<=M;i++)
      {
            scanf("%d%d%d",&x,&y,&c);
            a[x][y]+=c;
            add(x,y);
            add(y,x);
      }
}

void gasesc_drum()
{
      int p,nodc,c[MaxN],i,j;
      muchie *q=new muchie;
      sw=0;
      memset(uz,0,sizeof(uz));
      p=1; c[1]=st;
      uz[st]=1;
      for(j=1;j<=p && !sw;j++)
      {
            nodc=c[j];
            q=G[nodc];
            while(q)
            {
                  i=q->x;
                  if(a[nodc][i]==b[nodc][i] || uz[i])
                  {
                        q=q->urm;
                        continue;
                  }
                  uz[i]=1;
                  c[++p]=i;
                  s[i]=nodc;
                  if(i==f)
                        sw=1;
                  q=q->urm;
            }
      }
}

void imbun(int nod)
{
      if(nod!=st)
      {
            if(min>a[s[nod]][nod]-b[s[nod]][nod])
                  min=a[s[nod]][nod]-b[s[nod]][nod];
            imbun(s[nod]);
            b[s[nod]][nod]+=min;
            b[nod][s[nod]]-=min;
      }
}

void det_flux()
{
      do{
            //memset(s,0,sizeof(s));
            gasesc_drum();
            min=MAX;
            imbun(f);
            nr+=min;
      }while(sw);
}

void afis()
{
      freopen("maxflow.out","w",stdout);
      printf("%d\n",nr);
}

int main()
{
      cit();
      det_flux();
      afis();
      return 0;
}