Cod sursa(job #26965)

Utilizator rusRus Sergiu rus Data 5 martie 2007 22:57:57
Problema Cc Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.39 kb
#include<stdio.h>
#include<iomanip.h>
#define dim 204

typedef struct nod{
        int info;
        nod*urm;
        }*pnod,NOD;
pnod l[dim];
int n;
int c[dim][dim],f[dim][dim],cost[dim][dim];
int d[dim],s[dim],t[dim];
int flow;

void citire();
void solve();
int flux();
void drum();
int bellman();
void add(int ,int );
void afisare();
int main()
{
    freopen("cc.in","r",stdin);
    freopen("cc.out","w",stdout);
    
    citire();
    solve();   
    afisare(); 
    return 0;
}
void citire()
{
     scanf("%d",&n);
     int i,j,x;
     
     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;
                      }
     }
     for(i=1;i<=n;i++)
     {
                      add ( 0, i);
                      add (i,  0);
                      c[0][i]=1;
                      cost[0][i]=1;
     }
     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;
     }
     /*
     for(i=1;i<=n;i++)
     {
                      for(j=n+1;j<=n+n;j++)
                      printf("%d ",cost[i][j]);
                      printf("\n");
     }*/
     //for(pnod p=l[0];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(bellman())
      drum();
}
int bellman()
{
     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(!flux())
       break;
      if(d[n+n+1]==2000000) 
      return 0;
      return 1;
}
int flux()
{
    int i,j;
    int ok=0;
    
    for(i=0;i<=n+n+1;i++)
      for(pnod 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(j==n+n+1) return 1;
                 }
                 if(f[j][i])
                    if(d[j]>d[i]-cost[i][j])
                    {
                                            d[j]=d[i]-cost[i][j];
                                            t[j]=-i;
                                            ok=1;
                                            //if(j==n+n+1) return 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]++;
             else
                         f[i][j]--;
             i=j;
     }
     flow++;
}
void afisare()
{
     int i,j;
     int sol=0;
     
     for(i=1;i<=n;i++)
     {
                      for(j=n+1;j<=n+n;j++)
                      if(f[i][j])
                      sol+=cost[i][j];
     }
     
     printf("%d",sol);
}