Cod sursa(job #525755)

Utilizator mgntMarius B mgnt Data 26 ianuarie 2011 02:17:27
Problema Bibel Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
using namespace std;

typedef long long int lli;

lli const maxc=10*1000,maxn=18,inf=maxn*(2*(maxc*maxc)+1);
struct hamiltonian_path
{

lli m;
lli SX[maxn],SY[maxn],V[maxn];

lli n;
lli X[maxn],Y[maxn];
lli W[maxn][maxn];

lli D[1<<maxn][maxn];

int get_minimum_weight()
{	lli x,t,s,b,y,bx,v,dx,dy,dd;
	for(s=0;n>s;++s){D[0][s]=inf;}
	for(s=0;n>s;++s)
	{	for(t=0;m>t;++t)
		{	dx=(SX[t]-X[s]);dx*=dx;
			dy=(SY[t]-Y[s]);dy*=dy;
			dd=dx+dy+V[t];
			if(D[0][s]>dd){D[0][s]=dd;}
		}
	}
	for(s=0;n>s;++s)
	{	for(t=s;n>t;++t)
		{	dx=(X[s]-X[t]);dx*=dx;
			dy=(Y[s]-Y[t]);dy*=dy;
			dd=dx+dy;
			W[s][t]=W[t][s]=dd;
		}
	}
	t=(1<<n)-1;
	for(s=1;t>=s;++s)
	{	for(y=0;n>y;++y)
		{	b=inf;
			for(x=0;n>x;++x)
			{	bx=(1<<x);	
				if(0!=(s&bx))
				{	v=D[s^bx][x]+W[x][y];
					if(b>v){b=v;}
				}
			}
			D[s][y]=b;
		}
	}
	
	b=inf;
	for(y=1;n>y;++y)
	{	if(b>D[t][y]){b=D[t][y];}	}
	
	m=n;
	for(s=0;m>s;++s)
	{	SX[s]=X[s];
		SY[s]=Y[s];
		V[s]=D[t][s];
	}
	
	return b;
}

};

hamiltonian_path H;

int main()
{	ifstream is("bibel.in");
	ofstream os("bibel.out");
	lli op,a,n=0;
	H.SX[0]=H.SY[0]=H.V[0]=0;H.m=1;
	do
	{	is>>op;
		switch(op)
		{	case 0:
				is>>H.X[n]>>H.Y[n];++n;
				break;
			case 1:
				H.n=n;a=H.get_minimum_weight();
				os<<a<<endl;n=0;
				break;
		}
	} while(2!=op);
	return 0;
}