Cod sursa(job #59691)

Utilizator Ragnar_LodbrokGrosu Codrut Ragnar_Lodbrok Data 10 mai 2007 09:37:22
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>

#define NMAX 100

FILE *fin,*fout;

int N;

int cap[2*NMAX+2][2*NMAX+2];
int dist[2*NMAX+2][2*NMAX+2];
int sursa,dest;
int d[2*NMAX+2],tata[2*NMAX+2];
const int pin=100000000;

void recurs(int nod)
{if (nod)
    {cap[tata[nod]][nod]--;
     cap[nod][tata[nod]]++;
     recurs(tata[nod]);   
    }
}

int flux()
{int i,j,bol;
 for (i=sursa;i<=dest;++i) {d[i]=pin;tata[i]=0;}
 d[sursa]=0;
 bol=1;
 while (bol)
    {bol=0;
     for (i=sursa;i<=dest;++i)
        if (d[i]!=pin)
         for (j=sursa;j<=dest;++j) 
            if (cap[i][j]&&d[j]>d[i]+dist[i][j]) {d[j]=d[i]+dist[i][j];bol=1;tata[j]=i;}
    }
 if (tata[dest])
    recurs(dest);
 return (tata[dest]!=0);
}

int main()
{int i,j,S=0;
 fin=fopen("cc.in","r");
 fscanf(fin,"%d",&N);
 for (i=1;i<=N;++i)
    for (j=1;j<=N;++j)
        {fscanf(fin,"%d",&dist[i][N+j]);
         dist[N+j][i]=-dist[i][N+j];
         cap[i][N+j]=1;
        }
 fclose(fin);
 sursa=0;
 dest=2*N+1;
 for (i=1;i<=N;++i)
    {cap[sursa][i]=1;
     cap[N+i][dest]=1;
    }
 while (flux());
 for (i=1;i<=N;++i)
    for (j=N+1;j<=2*N;++j)
        if (!cap[i][j]) S+=dist[i][j];
 fout=fopen("cc.out","w");
 fprintf(fout,"%d\n",S);
 fclose(fout);
 return 0;
}