Cod sursa(job #26973)

Utilizator rusRus Sergiu rus Data 5 martie 2007 23:03:12
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.33 kb
#include<stdio.h>
#include<iomanip.h>
#include<math.h>
#define max 203

typedef struct nod{
               int info;
               nod*urm;
               }*PNOD,NOD;
PNOD l[max];

int c[max][max],f[max][max],cost[max][max];
int d[max],t[max];
int n;

void citire();
void add(int ,int );
int bellmand();
int minimizeaza();
void drum();
void solve();
void afiseaza();

int main()
{
    
    freopen("cc.in","r",stdin);
    freopen("cc.out","w",stdout);
    citire();
    solve();
    afiseaza();
    return 0;
}
void citire()
{
     int i,j,x;
     scanf("%d",&n);
     for(i=1;i<=n;i++)
     {
             for(j=1;j<=n;j++)
             {
                              scanf("%d",&x);
                              add ( i, j + n );
                              add ( j + n ,i );
                              c[ i ][ j + n ]= 1;
                              cost[ i ][ j + n]=x;
                              //printf("%d ",x);
             }
             //printf("\n");
     }
     
     for(i=1;i<=n;i++)
     {
                      add( 0 , i);
                      add( i ,0 );
                      c[ 0 ][ i ] = 1;
                      cost[ 0 ][ i ] =0;
     }
     for(i = n+1 ; i <= n+n ; i ++)
     {
           add ( i , n+n+1);
           add ( n+n+1 , i);
           c[ i ][ n+n+1 ]=1;
           cost [ i ][ n+n+1 ]=0;
     }  
     //PNOD p;
     //for(PNOD p=l[n+n+1];p;p=p->urm)
              //printf("%d ",p->info);
}       
void add(int  i, int  j)
{
     PNOD  p = new NOD;
     p -> info=j;
     p->urm= l[i];
     l[i]=p;
}
void solve()
{
     while(bellmand())
     drum();
}
int bellmand()
{
    int i,j;
    for(i=0;i<=n+n+1;i++)
    {
            d[i]=2000000;
            t[i]=0;
    }
    d[0]=0;
    for(i=1;i<n;i++)
    if(!minimizeaza())
    break;
    if(d[n+n+1]== 2000000)
          return 0;
          return 1;
}
int minimizeaza()
{
    int i,j,ok=0;
    PNOD p;
    for(i=0;i<=n+n+1;i++)
          for(p=l[i];p;p=p->urm)
               {
                                 j=p->info;
                                 if(c[i][j]>f[i][j])
                                        if(d[j]>d[i]+cost[i][j])
                                        {
                                                 d[j]=d[i]+cost[i][j];
                                                 t[j]=i;
                                                 ok=1;
                                        } 
                                   if(f[j][i])
                                         if(d[j]>d[i]-cost[j][i])
                                         {
                                                  d[j]=d[i]-cost[j][i];
                                                  t[j]=-i;
                                                  ok=1;
                                         }
               }
          
          return ok;
}
void drum()
{
     int i,j;
     i=n+n+1;
     while(i)
     {
             j=abs(t[i]);
             if(t[i]>=0)     f[j][i]+=1;
             else
                             f[i][j]-=1;
             i=j;
     }
}
void afiseaza()
{
     int i,j,sol=0;
     for(i=0;i<=n;i++)
           for(j=n+1;j<=n+n;j++)
               if(f[i][j])
               sol+=cost[i][j];
           printf("%d",sol);
}