Cod sursa(job #370025)

Utilizator victor.ionescuIonescu Victor Cristian victor.ionescu Data 29 noiembrie 2009 23:42:14
Problema Bibel Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <cstring>
#define INF 2100000000
using namespace std;
ifstream fi("bibel.in");
ofstream fo("bibel.out");
int D[2][1<<17][17];
int N[2];
struct point{ int x,y; } v[2][18];

inline int dist(int x1,int y1,int x2,int y2){
	return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}

inline int min(int x1,int x2){
	return x1<x2?x1:x2;
}

inline int max(int x1,int x2){
	return x1>x2?x1:x2;
}

int main(){
	int x,ind=0;
	fi>>x;
	N[0]=0;
	N[1]=1;
	v[1][1].x=v[1][1].y=0;
	D[1][1][0]=0;
	do {
		if (x==0){
			++N[ind];
			fi>>v[ind][N[ind]].x>>v[ind][N[ind]].y;
		} else if (x==1){
                        for (int i=0;i<(1<<N[ind]);++i)
                                for (int j=0;j<=N[ind];++j) D[ind][i][j]=INF;
			for (int i=1;i<=N[ind];++i)
				for (int j=1;j<=N[1-ind];++j) 
					D[ind][1<<(i-1)][i-1]=min(D[ind][1<<(i-1)][i-1],D[1-ind][(1<<N[1-ind])-1][j-1]+dist(v[1-ind][j].x,v[1-ind][j].y,v[ind][i].x,v[ind][i].y));
			
			for (int i=1;i<(1<<N[ind]);++i)
				for (int j=1;j<=N[ind];++j) if (i & (1<<(j-1)))
					for (int k=1;k<=N[ind];++k)
						if ((i&(1<<(k-1)))==0 && D[ind][i | (1<<(k-1))][k-1]>D[ind][i][j-1]+dist(v[ind][j].x,v[ind][j].y,v[ind][k].x,v[ind][k].y))
							D[ind][i | (1<<(k-1))][k-1]=D[ind][i][j-1]+dist(v[ind][j].x,v[ind][j].y,v[ind][k].x,v[ind][k].y);
			int mini=D[ind][(1<<N[ind])-1][0];
			for (int i=2;i<=N[ind];++i) mini=min(mini,D[ind][(1<<N[ind])-1][i-1]);
			fo<<mini<<"\n";
			ind=1-ind;
			N[ind]=0;
		}
		if (x!=2) fi>>x;
	} while (x!=2);
	fi.close();
	fo.close();
	return 0;
}