Cod sursa(job #139162)

Utilizator snaked31Stanica Andrei snaked31 Data 19 februarie 2008 19:38:58
Problema Bibel Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;


#define nm 17
#define INF 0x3f3f3f3f
#define pb push_back


struct point
{
	int x;
	int y;
};


vector <point> v, w;
vector <int> vd, wd;

int k, x, y;
int A[1 << nm][nm], D[nm][nm];


int solve();

void read()

{
	w.pb((point) { 0, 0});
	wd.pb(0);

	while (!feof(stdin))
	{
		scanf("%d ", &k);

		switch (k)
		{
			case 0:
			{
				scanf("%d %d ", &x, &y);
				v.pb((point) {x, y} );
				break;
			}
			case 1:
			{
				printf("%d\n", solve());
				
				v.swap(w);
				v.clear();
				vd.swap(wd);
				vd.clear();

				break;
			}
			case 2:
			{
			}
		}
	}
}


int dist(const point a, const point b)

{
	return ((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}


inline int MN(int a, int b) { return (a < b ? a : b); }


int solve()

{
	int i, j, cfg;

	for (i=0; i<(1 << v.size()); ++i)
	{
		for (j=0; j<v.size(); ++j)
		{
			A[i][j] = INF;
		}
	}

	for (i=0; i<v.size(); ++i)
	{
		for (j=0; j<v.size(); ++j)
		{
			D[i][j] = dist(v[i], v[j]);
		}
	}

	for (i=0; i<v.size(); ++i)
	{
		for (j=0; j<w.size(); ++j)
		{
			A[1 << i][i] = MN(A[1 << i][i], dist(v[i], w[j]) + wd[j]);
		}
	}

	for (cfg=0; cfg < (1 << v.size()); ++cfg)
	{
		vector <int> poz;
		for (i=0; i<v.size(); ++i)
		{
			if (cfg & ( 1 << i))
				poz.pb(i);
		}

		if (poz.size() > 1)
		for (i=0; i<v.size(); ++i)
		{
			if (cfg & (1 << i))
			{
				int cfg2 = cfg ^ (1 << i);
				for (j=0; j<poz.size(); ++j)
				{
					if (poz[j] != i)
					{
						A[cfg][i] = MN(A[cfg][i], A[cfg2][poz[j]] + D[poz[j]][i] );
					}
				}
//				cfg2 = cfg ^ (1 << i);
			}
		}
	
	}

		for (i=0; i<v.size(); ++i)
		{
			vd.pb(A[(1 << v.size()) -1][i]);
		}
		return *min_element(vd.begin(), vd.end());
	
}


int main()

{
	freopen("bibel.in", "r", stdin);
	freopen("bibel.out","w",stdout);

	read();
	
	return 0;
}