Cod sursa(job #6268)

Utilizator rusRus Sergiu rus Data 18 ianuarie 2007 17:01:51
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.6 kb
#include<stdio.h>
#include<iomanip.h>
#include<math.h>
#define MAX 204

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

int f[MAX][MAX],c[MAX][MAX],cost[MAX][MAX];
int tata[MAX];
int d[MAX];
int n;

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

int main()
{
    freopen("cc.in","r",stdin);
    freopen("cc.out","w",stdout);
    
    citire();
    solve();
    afisare();
    
     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]=cost[j+n][i]=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;
                                  
             }
                                  
             //PNOD p;
             //for(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;
     for(i=0;i<=n+n+1;i++)
     {
          d[i]=2000000;
	  tata[i]=0;
     }
     d[0]=0;
     for(i=0;i<n+n+1;i++)
          if(!minimizeaza())
		break;
            
	   if(d[n+n+1]==2000000)
		       return 0;
		 return 1;
}
int minimizeaza()
{
    
    int i,j,ok;
    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];
                                                         tata[j]=i;
                                                         ok=1;
                                               }
                                               if(f[j][i])
                                                    if(d[j]>d[i]-cost[i][j])                                                
                                                    {
                                                         d[j]=d[i]-cost[i][j];
                                                         tata[j]=-i;
                                                         ok=1;
                                                    } 
                     }
          return ok;
}
void drum()
{
     int i,j;
     i=n+n+1;
     while(i)
     {
     j=abs(tata[i]);
	     if(tata[i]>=0)  f[j][i]+=1;
	     else
			  f[i][j]-=1;
	     i=j;
     }
}
                                                                                                                                                       
void afisare()
{
     int i,j,sol;
     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);
}