Cod sursa(job #862951)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 23 ianuarie 2013 03:51:38
Problema Felinare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <stdio.h>

#define NMAX 8200
#define MMAX 20003
#define alias(x) (n+x)
#define SURSA 0
#define DESTINATIA (2*n+1)
#define Infinity (0x3f3f3f3f)

int i,j,n,m,Cap[2*NMAX][2*NMAX],Flux[2*NMAX][2*NMAX],DRez[2*NMAX];
int C[2*NMAX],up[2*NMAX],Mark[2*NMAX];
int A[NMAX][NMAX];

#define old (C[st])
 
void GetDrumRez(int S, int D)
{
 int i,st=0,end,poz=0,j;
 for (i=1;i<=n;i++)
    C[i]=up[i]=Mark[i]=0;
 C[++st]=S; up[st]=0; end=1; Mark[S]=1;
 for (st=1;st<=end;st++)
    {
     for (j=1;j<=A[old][0];j++)
        if (!Mark[A[old][j]] && Cap[old][A[old][j]]-Flux[old][A[old][j]]>0)
          {
           C[++end]=A[old][j];
           up[end]=st;
           Mark[A[old][j]]=1;
           if (A[old][j]==D) { poz=end; break; }
          }
     if (poz==end) break;
    }
 while (poz)
      {
       DRez[++DRez[0]]=C[poz];
       poz=up[poz];
      }
}
 
#define back  (DRez[i+1])
#define front (DRez[i])
 
int GetFlux(int S, int D)
{
 int gasit=1,i;
 while (gasit)
      {
       for (i=1;i<=DRez[0];i++) DRez[i]=0; DRez[0]=0;
       GetDrumRez(S,D);
       if (!DRez[0])
         gasit=0;
         else {
               int md=Infinity;
               for (i=DRez[0]-1;i>=1;i--)
                  if (Cap[back][front]-Flux[back][front]<md)
                    md=Cap[back][front]-Flux[back][front];
               for (i=DRez[0]-1;i>=1;i--)
                  {
                   Flux[back][front]+=md;
                   Flux[front][back]-=md;
                  }
              }
      }
      
 int Fluxu=0;
 for (i=1;i<=2*n;i++)
     Fluxu+=Flux[i][D];
     
 return Fluxu;
}


int main()
{
    FILE* f = fopen("felinare.in","r");
    
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=m;i++)
    {
        int x,y;
        fscanf(f,"%d%d",&x,&y);
        Cap[x][alias(y)]=1;
        Cap[y][alias(x)]=1;
        A[x][++A[x][0]] = alias(y);
        A[y][++A[y][0]] = alias(x);
    }
    
    fclose(f);
    
    int cuplaj=GetFlux(SURSA,DESTINATIA);
    
    printf("%d\n",2*n-cuplaj);
    
    return 0;
}