Cod sursa(job #19930)

Utilizator rusRus Sergiu rus Data 20 februarie 2007 11:46:40
Problema Cc Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.21 kb
#include<stdio.h>
#include<iomanip.h>
#define dim 203

typedef struct nod{
        int info;
        nod*urm;
        }*pnod,NOD;
pnod l[dim];
int flow=0;
int n;
int s[dim],t[dim],c[dim][dim],f[dim][dim];
int cost[dim][dim];
int d[dim];
void citire();
void add(int i,int j);
void solve();
int  bellman();
int minimizeaza();
void drum();
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;
                       }
      }
      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;
      }
      //for(pnod p=l[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(bellman())
     drum();
}
int bellman()
{
    int i;
    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;
      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(f[j][i])
                    if(d[j]>d[i]-cost[i][j])
                    {
                                d[j]=d[i]-cost[i][j];
                                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]++;
             else
                         f[i][j]--;
             i=j;
                         
     }
     
     flow++;
}            
void afiseaza()
{
     int i,j,sol=0;
     //printf("%d ",flow);
     for(i=0;i<=n;i++)
     {
                      for(j=n+1;j<=n+n;j++)
                      if(f[i][j])
                      sol+=cost[i][j];
                      //printf("%d %d\n",i,j-n);
     }
     printf("%d",sol);
}