Cod sursa(job #566567)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 29 martie 2011 10:10:14
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<cstdio>
#include<queue>
#define Nmax 256
#define inf 0x3f3f3f3f

using namespace std;

int N,fm[Nmax][Nmax],cost[Nmax][Nmax],t[Nmax],v[Nmax],vec[Nmax][Nmax],cp[Nmax][Nmax];
bool inQ[Nmax];
queue <int> c;

int bf(){
	
	memset(inQ,0,sizeof(inQ));
	memset(v,inf,sizeof(v));
	
	v[0]=0;
	c.push(0);
	inQ[0]=1;
	
	while(!c.empty()){
		
		int nod=c.front();
		c.pop();
		inQ[nod]=0;
		
		for(int dest=1; dest<=2*N+1; ++dest){
			
			if(vec[nod][dest])
				if(v[dest] > v[nod] + cost[nod][dest] && fm[nod][dest] < cp[nod][dest]){
					
					v[dest]=v[nod]+cost[nod][dest];
					t[dest]=nod;
					
					if(!inQ[dest])
						inQ[dest]=1,
						c.push(dest);
					
				}

			
		}
	}
	
	if(v[2*N+1]!=inf)
		return 1;
	return 0;	
}
int main(){

	freopen("cc.in","r",stdin);
	freopen("cc.out","w",stdout);
	
	scanf("%d",&N);
	
	for(int i=1;i<=N;++i)
		for(int j=1;j<=N;++j){
			
			int x;
			scanf("%d",&x);
			vec[i][N+j]=1;
			vec[N+j][i]=1;
			
			cp[i][N+j]=1;
			
			cost[i][N+j]=x;
			cost[N+j][i]=-x;
		}
	
	for(int i=1;i<=N;++i)
		vec[0][i]=1,
		vec[i][0]=1,
		cp[0][i]=1,
		cp[N+i][2*N+1]=1,
		vec[N+i][2*N+1]=1,
		vec[2*N+1][N+i]=1;
	
	int sol=0;
		while(bf()) {
			
			int fmn=inf;
			
			for(int nod=2*N+1;nod!=0;nod=t[nod])
				fmn=min(fmn,1-fm[t[nod]][nod]);
			
			for(int nod=2*N+1;nod!=0;nod=t[nod]){
				
				fm[t[nod]][nod]+=fmn;
				fm[nod][t[nod]]-=fmn;
			}
			
			sol+=v[2*N+1]*fmn;
			
		}
	
	printf("%d\n",sol);
return 0;
}