Cod sursa(job #360726)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 1 noiembrie 2009 19:36:57
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

#define file_in "cc.in"
#define file_out "cc.out"

#define Inf 0x3f3f3f3f
#define Nmax 220
#define pb push_back

int n,m,C[Nmax][Nmax],P[Nmax][Nmax],F[Nmax][Nmax],viz[Nmax*Nmax],dm[Nmax*Nmax],s,d,t[Nmax*Nmax],q[Nmax*Nmax];

void citire()
{
	int x,y,c,f,i,j; 
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &n);
	
	s=0;
    d=2*n+1;	
	
	for (i=1;i<=n;++i)
		for (j=n+1;j<d;++j)
		{
			scanf("%d", &P[i][j]);
			
			P[j][i]=-P[i][j];
			C[i][j]=1;
		}

	for (i=1;i<=n;++i)
	{
		C[s][i]=1;
		C[i+n][d]=1;
	}
}

inline int bf()   
{   
     for (int i=s;i<=d;++i)   
          dm[i]=Inf,    
          viz[i]=0;
	 int st=0,dr=1, nod;   
     q[1]=s;   
     dm[s]=0;   
     viz[s]=1;   
     while (st<dr)   
     {   
          nod=q[++st];   
          for (int i=s;i<=d;++i) 
		  if ((dm[nod]+P[nod][i]<dm[i]) && (C[nod][i]-F[nod][i]>0))   
          {   
               dm[i]=dm[nod]+P[nod][i];   
               t[i]=nod;   
               if (!viz[i])   
               {   
                    q[++dr]=i;        
                    viz[i]=1;   
               }   
          }   
          viz[nod]=0;             
     }   
     return (dm[d]<Inf/2);   
}   
	

void solve()
{
	int sol=0;
    while (bf())   
     {   
          int r=C[t[d]][d]-F[t[d]][d];   
          for (int i=d;i!=s;i=t[i])        
               if (C[t[i]][i]-F[t[i]][i]<r)    
                    r=C[t[i]][i]-F[t[i]][i];   
          for (int i=d;i!=s;i=t[i])        
               F[t[i]][i]+=r,   
               F[i][t[i]]-=r;   
         sol+=r*dm[d];   
     }   

     printf("%d", sol);	
}

int main()
{
	citire();
	solve();
		
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}