Cod sursa(job #16882)

Utilizator nemesisIchim Alexandru Eugen nemesis Data 14 februarie 2007 13:46:48
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#include<string.h>
int n, f[256][256], a[256][256], dist[256], pred[256];

int bellman()
{
  memset(pred, -1, sizeof(pred));
  memset(dist, 0x3f3f, sizeof(dist));
  dist[0]=0;
  pred[0]=0;

  int i, j, ok=1;

  while(ok) {
    ok=0;
    for(i=0; i<=2*n+1; ++i)
      for(j=0; j<=2*n+1; ++j) if( f[i][j]>0 && dist[j] > dist[i]+ a[i][j]) {
	dist[j]=dist[i] + a[i][j];
	pred[j]=i;
	ok=1;
      }
  }
  if( pred[2*n+1] ==-1) return 0;
  return 1;
}

void flux()
{
  int i, j;
  for(i=1; i<=n; ++i) f[0][i]=f[n+i][2*n+1]=1;
  while( bellman()) {
    int p= 2*n+1;
    while(p) {
      f[pred[p]][p]--;
      f[p][pred[p]]++;
      p=pred[p];
    }
  }
  int sum=0;
  for(i=1; i<=n; ++i) for(j=n+1; j<=2*n; ++j) if( !f[i][j]) sum+= a[i][j];
  printf("%d\n",sum);
}

int main()
{
  freopen("cc.in","r",stdin);
  scanf("%d",&n);
  for(int i=1; i<=n; ++i)
    for(int j=1; j<=n; ++j) {
      scanf("%d",&a[i][j+n]);
      a[j+n][i]= -a[i][j+n];
      f[i][j+n]=1;
    }

  freopen("cc.out","w",stdout);
  flux();

  return 0;
}