Cod sursa(job #1610387)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 23 februarie 2016 14:50:14
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <functional>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <bitset>
#include <stack>
#include <iomanip>
#define MOD 1000000007
#define NMAX 17
#define INF 0x3f3f3f3f

using namespace std;

FILE *fin = freopen("bibel.in", "r", stdin);
FILE *fout = freopen("bibel.out", "w", stdout);

typedef pair<int, int> pii;

int Cost[NMAX][NMAX], A[NMAX][2], B[1 << NMAX][NMAX], Min[NMAX], last[NMAX][3];

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

int main() {
	int n = 0, q, x, y, i, j, nr = 1, k, res;

	while (1) {
		scanf("%d", &q);
		if (q == 0) {
			scanf("%d%d", &A[n][0], &A[n][1]);
			++n;
		}
		else if (q == 1) {
			res = INF;
			for (i = 0; i < n; ++i)
				for (j = 0; j < n; ++j)
					Cost[i][j] = Cost[j][i] = calcDist(A[i][0], A[j][0], A[i][1], A[j][1]);


			for (i = 0; i < (1 << NMAX); ++i)
				for (j = 0; j < NMAX; ++j)
					B[i][j] = INF;

			for (i = 0; i < n; ++i)
				for (j = 0; j < nr; ++j)
					B[1 << i][i] = min(B[1 << i][i], Min[j] + calcDist(last[j][0], A[i][0], last[j][1], A[i][1]));


			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))
								B[i][j] = min(B[i][j], B[i ^ (1 << j)][k] + Cost[k][j]);

			int aux = INF;
			for (i = 0; i < n; ++i)
				aux = min(aux, B[(1 << n) - 1][i]);
			if (aux < res)
				res = aux;

			for (i = 0; i < n; ++i)
				Min[i] = B[(1 << n) - 1][i];

			memset(Cost, INF, sizeof(Cost));
			nr = n;
			for (i = 0; i < nr; ++i)
				last[i][0] = A[i][0], last[i][1] = A[i][1];
			n = 0;

			printf("%d\n", res);
		}
		else
			break;
	}

	return 0;
}