Cod sursa(job #134157)

Utilizator gigi_becaliGigi Becali gigi_becali Data 10 februarie 2008 19:32:03
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
using namespace std;
#include <cstdio>
#include <string>
#include <queue>
#define maxn 402
#define oo 0x3f3f3f3f



int cost[maxn][maxn],c[maxn][maxn],C[maxn][maxn],d[maxn],t[maxn];
int source, sink;
int n;
int l[maxn], r[maxn];
bool use[maxn];
int S[201][201];

void read()
{
  freopen("cc.in","r",stdin);
  scanf("%d\n", &n);
  int i, j, p;
  source=0;
  sink=2*n+1;

  for(i=1;i<=n;++i)
    for(j=1;j<=n;++j)
      {
	scanf("%d ", &p);
	cost[i][j+n]=p;
	cost[j+n][i]=-p;
	c[i][j+n]=1;
	C[i][j+n]=1;
	
      }
  
  for(i=1;i<=n;++i) cost[source][i]=0, c[source][i]=1, C[source][i]=1;
  for(i=n+1;i<=(n<<1);++i) cost[i][sink]=0, c[i][sink]=1, C[i][sink]=1;

}

inline int bellman()
{
  queue<int>Q;

  int u, i;
  memset(d, oo, sizeof(d));
  memset(t, 0, sizeof(t));

  d[source]=0;

  Q.push(source);
  
  while(!Q.empty())
    {
      u=Q.front();
      Q.pop();

      for(i=source;i<=sink;++i)
	if(c[u][i])
	  if(d[u]+cost[u][i]<d[i])
	    {
	      d[i]=d[u]+cost[u][i];
	      Q.push(i);
	      t[i]=u;
	    }
    }

  if(d[sink]==oo) return 0;

  for(i=sink; i!=source; i=t[i]) 
    {
      c[t[i]][i]=0;
      c[i][t[i]]=1;
    }
  return 1;

}

int main()
{
	read();
	while(bellman());
	int i, j,s=0;
	for(i=1;i<=n;++i)
		for(j=n+1;j<sink;++j) 
			if(!c[i][j]) s+=cost[i][j];
freopen("cc.out","w",stdout);
	printf("%d\n",s);
	return 0;
}