Cod sursa(job #3614)

Utilizator gigi_becaliGigi Becali gigi_becali Data 27 decembrie 2006 11:02:16
Problema Cc Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
//(c)Mircea Dima

#include <cstdio>
#include <string>
#define oo 0x3f3f3f3f
#define maxn 128

int cost[2*maxn][2*maxn], c[2*maxn][2*maxn],n, sursa, dest;

void citire()
{
  freopen("cc.in", "r", stdin);
  scanf("%d\n", &n);
  int i, j;
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
      {
	int p;
	scanf("%d ", &p);
	cost[i][j+n]=p;
	cost[j+n][i]=-p;
	c[i][j+n]=1;
      }

  sursa=0;
  dest=2*n+1;
  for(i=1;i<=n;i++) cost[sursa][i]=0, c[sursa][i]=1;
  for(i=n+1;i<=n<<1;i++) cost[i][dest]=0, c[i][dest]=1;
}

int bellman()
{
  int d[maxn], t[maxn], i, j, ok;
  memset(d, oo, sizeof(d));
  memset(t, -1, sizeof(t));
  d[0]=0;
  ok=1;
  while(ok)
    {
      ok=0;
      for(i=sursa;i<=dest;i++)
	if(d[i]!=oo)
	  for(j=sursa;j<=dest;j++)
	    if(c[i][j])
	      if(d[i]+cost[i][j]<d[j])
		{
		  d[j]=d[i]+cost[i][j];
		  t[j]=i;
		  ok=1;
		}
    }


 if(t[dest]==-1)return 0;

  i=dest;
 while(i!=-1)  
  {
      c[t[i]][i]=0;
      c[i][t[i]]=1;
      i=t[i];  
  }

 //int nr=0;  
  //  for(i=n+1;i<=n<<1;i++) if(c[i][dest]==0) nr++;
  // if(nr==n) return 0;
  return 1;

}


void max_flow()
{
  while(bellman());
}

void afis()
{
  int sum=0, i, j;

  for(i=1;i<=n;i++)
    {
      for(j=n+1;j<=n<<1;j++)if(c[i][j]==0) { sum+=cost[i][j]; break;}
    }
  /*
  for(i=1;i<=n;i++)
    {
    for(j=n+1;j<=2*n;j++) printf("%d ", c[i][j]);
    printf("\n");
    }
  */
  freopen("cc.out", "w", stdout);

  printf("%d\n", sum);
}

int main()
{
  citire();
  max_flow();
  afis();
  return 0;
}