Cod sursa(job #1744270)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 19 august 2016 15:48:42
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <limits>
using namespace std;

ifstream cin("bibel.in");
ofstream cout("bibel.out");

const int MAXN = 17;
const int INF = numeric_limits<int>::max();

int level = 1, n = 0;
int x[MAXN], y[MAXN], x0[MAXN], yMori[MAXN], previous;
int dp[1 << MAXN][MAXN];

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

int Solve() {
    if (level == 1)
        previous = n;
    for (int i = 1; i < (1 << n); i++)
        for (int j = 0; j < n; j++)
            dp[i][j] = INF;
    for (int j = 0; j < previous; j++)
        for (int i = 0; i < n; i++)
            dp[1 << i][i] = min(dp[1 << i][i], dp[0][j] + Distance(x[i], y[i], x0[j], yMori[j]));
    for (int i = 1; i < (1 << n); i++)
        for (int j = 0; j < n; j++)
            if (i & (1 << j))
                for (int k = 0; k < n; k++)
                    if (i & (1 << k) && k != j)
                        dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][k] + Distance(x[k], y[k], x[j], y[j]));
    int answer = INF;
    for (int i = 0; i < n; i++) {
        answer = min(answer, dp[(1 << n) - 1][i]);
        x0[i] = x[i];
        yMori[i] = y[i];
        dp[0][i] = dp[(1 << n) - 1][i];
    }
    previous = n;
    return answer;
}

int main() {
    while (1) {
        int type;
        cin >> type;
        if (type == 0) {
            cin >> x[n] >> y[n];
            n++;
        }
        if (type == 1) {
            cout << Solve() << "\n";
            n = 0;
            level++;
        }
        if (type == 2)
            return 0;
    }
    return 0;
}