Cod sursa(job #360722)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 1 noiembrie 2009 19:04:37
Problema Cc Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 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];
vector<int> v[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=1;j<=n;++j)
		{
			scanf("%d", &x);
			P[i][j+n]=x;
			P[j+n][i]=-x;
		    v[i].pb(j+n);
			v[j+n].pb(i);
			v[i].pb(s);
			v[s].pb(i);
			v[d].pb(j+n);
			v[j+n].pb(d);
			C[i][j+n]=1;
			C[s][i]=1;
			C[j+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=0;i<v[nod].size();++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;
}