Cod sursa(job #383609)

Utilizator FlorianFlorian Marcu Florian Data 17 ianuarie 2010 11:48:17
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
using namespace std;
#include<fstream>
#include<vector>
#define oo LONG_MAX
#define x first
#define y second
#define mk make_pair
int cst[20][20];
int N;
int bst[(1<<17)+7][18];
vector<pair<int,int> > p;
vector<pair < pair<int, int>, int>  > pre;
ifstream f("bibel.in"); ofstream g("bibel.out");
void solve()
{
	int i,j,k;
	N = p.size();
	for(i = 0; i < N; ++i)
		for(j = 0; j < N; ++j)
			cst[i][j] = (p[i].x - p[j].x)*(p[i].x - p[j].x) + (p[i].y - p[j].y)*(p[i].y - p[j].y);
	for(i = 1; i < (1<<N); ++i)
		for(j = 0; j < N; ++j)
			bst[i][j] = oo;
	for(i = 0; i < N; ++i)
		for(j = 0; j < pre.size(); ++j)
			bst[1<<i][i] = min(bst[1<<i][i], pre[j].y + (pre[j].x.x - p[i].x) * (pre[j].x.x - p[i].x) + ( pre[j].x.y - p[i].y ) * ( pre[j].x.y - p[i].y ));
	
	for( i = 1; i < (1<<N); ++i)
	{
		for(j = 0; j < N; ++j)
			if(i & (1<<j))
				for( k = 0; k < N; ++k)
				{
					if(!(i & (1<<k))) 					
					if( bst[i | (1<<k)][k] > bst[i][j] + cst[j][k] )
						bst[i | (1<<k)][k] = bst[i][j] + cst[j][k];
				}		
	}
	
	int sol = oo;
	pre.clear();
	for(i = 0; i < N; ++i)
	{
		sol = min(sol, bst[(1<<N)-1][i]);
		pre.push_back(mk(p[i], bst[(1<<N)-1][i]));
	}
	p.clear();
	g<<sol<<"\n";
}
int main()
{
	int op,a,b;
	pre.push_back(mk(mk(0,0),0));
	for(f>>op; op!=2; f>>op)
	{	
		if(op == 1)	 solve();
		else { f>>a>>b; p.push_back(mk(a,b)); }
		
	}
	return 0;
}