Cod sursa(job #1448)

Utilizator pocaituDavid si Goliat pocaitu Data 13 decembrie 2006 18:15:32
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<fstream.h>
int long d[204],pre[204],i,j,m[204][204],c[204][204],n,flux,min,nr;
void drum()
{memset(d,0,sizeof(d));
 memset(pre,0,sizeof(pre));
 int i,j,k;
// for(i=1;i<=n+1;i++)
//  {d[i]=m[1][i];
//   pre[i]=1;
 //  d[i+n]=d[i]+m[i][i+n];
 //  pre[i+n]=i;
 //  }
 for(i=n+2;i<=2*n+2;i++)
   d[i]=-1000;
 for(i=2;i<=n+1;i++)
  {pre[i]=1;
   if(!c[1][i])
	d[i]=1000;
  }
 for(i=1;i<=n+2;i++)
  for(j=1;j<=2*n+2;j++)
   {if(j<n+2)
	  {for(k=n+2;k<=2*n+1;k++)
		if(c[j][k]&&((d[k]>d[j]+m[j][k])||(d[k]==-1000)))
		  {d[k]=d[j]+m[j][k];
		   pre[k]=j;
		   }
	  }
   else
	{for(k=1;k<=n+1;k++)
	 if(c[j][k]&&((d[k]>d[j]+m[j][k])||(d[k]==-1000)))
	 {d[k]=d[j]+m[j][k];
	  pre[k]=j;
	  }
    k=2*n+2;
	if(c[j][k]&&((d[k]>d[j]+m[j][k])||(d[k]==-1000)))
	 {d[k]=d[j]+m[j][k];
	  pre[k]=j;
	  }

	}


 }}

int main()
{ifstream f("cc.in");
 f>>n;
 for(i=2;i<=n+1;i++)
  for(j=n+2;j<=n*2+1;j++)
	{f>>m[i][j];
	 c[i][j]=1;
	 }
 for(i=2;i<=n+1;i++)
	 c[1][i]=1;
  for(j=n+2;j<=n*2+1;j++)
	c[j][2*n+2]=1;
 while(flux<n)
  {drum();
   for(i=2*n+2,min=20;pre[i]>=1;i=pre[i])
	if(c[pre[i]][i]<min)
	  min=c[pre[i]][i];
   for(i=2*n+2;pre[i]>=1;i=pre[i])
	  {c[i][pre[i]]+=min;
	   c[pre[i]][i]-=min;
	   if(m[pre[i]][i])
		 m[i][pre[i]]=(-1)*m[pre[i]][i];
	   }
   flux+=min;
   nr+=d[2*n+2];
   }
 ofstream g("cc.out");
  g<<nr;
 g.close();
 return 0;
 }