Cod sursa(job #6241)

Utilizator rusRus Sergiu rus Data 18 ianuarie 2007 16:25:41
Problema Cc Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.36 kb
#include<stdio.h>
#include<math>
#define dim 101
using namespace std;

typedef struct nod{
               int info;
               nod*urm;
               }*PNOD,NOD;

PNOD l[2*dim+1];
int f[dim][dim],t[dim],s[dim],c[dim][dim],cost[dim][dim],d[dim];
int n;
int flow=0;

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

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]=c[j+n][i]=1;
                                       cost[i][j+n]=cost[j+n][i]=x;
                      }
                      //printf("\n");
     }
     for(i=1;i<=n;i++)
     {
                      add ( 0,i);
                      add (i,0);
                      c[0][i]=c[i][0]=1;
                      cost[0][i]=cost[i][0]=0;
     }
     for(j=n+1;j<=n+n;j++)
     {
                          add(j,n+n+1);
                          add(n+n+1,j);
                          c[j][n+n+1]=c[n+n+1][j]=1;
     
     }
     //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(bellmanford())
     drum();
}
int bellmanford()
{
     int i;
     for(i=0;i<=n+n+1;i++)
     {
			  d[i]=2000;
			  t[i]=0;
     }
     d[0]=0;
     for(i=0;i<=n+n+1;i++)
     minimizeaza();
     if(d[n+n+1]==2000)
     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];
                                           ok=1;
                                           t[j]=i;
                                           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];
                                            ok=1;
                                            t[j]=-i;
                                            if(j==n+n+1) return 1;
                    }
       }
       return ok;
}
void drum()
{
     int i,j;
     j=n+n+1;
     while(j)
     {
             i=abs(t[j]);
             if(t[i]>=0) f[i][j]++;
             else
                         f[j][i]--;
             j=i;
     }
     flow++;
}
void afisare()
{
     printf("%d \n",flow);
     int i,j,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 %d",i,j-n);
                      //printf("\n");
     }
     printf("%d",sol);
     
}