Cod sursa(job #528014)

Utilizator Balmus_MaximBalmus Maximilian Balmus_Maxim Data 1 februarie 2011 19:58:48
Problema Bibel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#define maxn 1<<21


struct nrt{
	int x,y;
};

int pit(nrt a,nrt b)
{
	return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
};

int p1,cont[2],a,b,d[18][18],sll[maxn][17],dpr[18][18],dpp[18],i,j;
nrt v[2][17];

int main()
{
	freopen("bibel.in","r",stdin);
	freopen("bibel.out","w",stdout);
	scanf("%d",&p1);
	cont[1]=1;
	v[1][0].x=0;
	v[1][0].y=0;
	int ind=0;
	while(p1!=2){
		if(p1==0){
			cont[ind]++;
			scanf("%d%d",&v[ind][cont[ind]].x,&v[ind][cont[ind]].y);
		}
		if(p1==1){
			for(i=0;i<(1<<cont[ind]);i++){
				for(j=0;j<cont[ind];j++){
					sll[i][j]=maxn;
				}
			}
			for(i=0;i<cont[ind];i++){
				for(j=i;j<cont[ind];j++){
					dpr[i][j]=pit(v[ind][i],v[ind][j]);
					dpr[j][i]=dpr[i][j];
				}
			}
			for(i=0;i<cont[ind];i++){
				for(j=0;j<cont[ind^1];j++){
					if(dpp[j]+pit(v[ind][i],v[ind^1][j])<sll[1<<i][i]){
					sll[1<<i][i]=dpp[j]+pit(v[ind][i],v[ind^1][j]);
				}
				}
			}
			for(i=0;i<(1<<cont[ind]);i++){
				for(j=0;j<cont[ind];j++){
					if((1<<j)&i){
						for(int k=0;k<cont[i];k++){
							if((1<<k)&i){
								if(sll[i][j]+dpr[k][j]<sll[i^(1<<k)][k]){
								sll[i^(1<<k)][k]=sll[i][j]+dpr[k][j];
							}
							}
						}
					}
				}
			}
			int sol=maxn;
			for(i=0;i<cont[ind];i++){
				dpp[i]=sll[(1<<cont[ind])-1][i];
				if(sol>sll[(1<<cont[ind])-1][i]){
				sol=sll[(1<<cont[ind])-1][i];
			}
			}
			printf("%d\n",sol);
			ind=ind^1;
			cont[ind]=0;
		}
		if(p1!=2){
			scanf("%d",&p1);
		}
	}
	return 0;
}