Cod sursa(job #475245)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 6 august 2010 13:40:22
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define Nmax 205
#define pb push_back
#define INF 2147000000

using namespace std;

queue< int > Q;
vector< int > v[Nmax];
int F[Nmax][Nmax],C[Nmax][Nmax],Cost[Nmax][Nmax];
int inq[Nmax],Dist[Nmax],prev[Nmax];
int n,Rez,dh;

inline int Minim(int x,int y){ return x<y ? x:y; }

void bellman(){
	int i,x; vector<int>::iterator it;
	for(i=1;i<=2*n+1;++i) Dist[i]=INF;
	Q.push(2*n+2);
	
	while( !Q.empty() ){
		x=Q.front(); Q.pop(); inq[x]=0;
		if( x == 2*n+1 ) continue;
		
		for(it=v[x].begin(); it!=v[x].end(); ++it)
			if( C[x][*it] > F[x][*it] && Dist[*it]>Dist[x]+Cost[x][*it]){
				Dist[*it]=Dist[x]+Cost[x][*it];
				prev[*it]=x;
				if( ! inq[*it] ){
					inq[*it]=1;
					Q.push(*it);
				}
			}
	}
	
	for(i=2*n+1; i!=2*n+2; i=prev[i])
		F[prev[i]][i]++, F[i][prev[i]]--;
	Rez += Dist[2*n+1];
}	

int main(){
	int i,j;
	freopen("cc.in","r",stdin);
	freopen("cc.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i)
		for(j=1;j<=n;++j){
			scanf("%d",&Cost[i][n+j]);
			Cost[n+j][i]=-Cost[i][n+j];
			C[i][n+j]=1; C[n+j][i]=0;
			
			v[i].pb(n+j); v[n+j].pb(i);
		}
	
	// sursa 2*n+2 destinatia 2*n+1
	for(i=1;i<=n;++i) v[2*n+2].pb(i), C[2*n+2][i]=1, Cost[2*n+2][i]=0;
	for(i=n+1;i<=2*n;++i) v[i].pb(2*n+1), C[i][2*n+1]=1, Cost[i][2*n+1]=0;
	
	for(i=1;i<=n;++i)
		bellman();

	
	printf("%d\n",Rez);
	fclose(stdin); fclose(stdout);
	return 0;
}