Cod sursa(job #1456392)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 30 iunie 2015 15:23:52
Problema Bibel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define st first
#define nd second

using namespace std;

ifstream fin("bibel.in");
ofstream fout("bibel.out");

const int Dim = 1 << 17;
const int INF = 0x3f3f3f3f;

int Path[Dim][17];
pair < int,int > B[18];

inline int Dst(pair < int,int > A,pair < int,int > B)
{
    return (A.st - B.st) * (A.st - B.st) + (A.nd - B.nd) * (A.nd - B.nd);
}

inline int Min(int A,int B)
{
    return (A < B) ? A : B;
}

int main()
{
    int N,Op,Sol;

    do
    {
        N = 0;

        do
        {
            fin >> Op;
            if (Op == 0)
            {
                N++;
                fin >> B[N].st >> B[N].nd;
            }
        }while(Op == 0);

        B[0] = mp(0,0);

        for (int i = 0;i < (1 << N);i++)
            for (int j = 0;j < N;j++)
               Path[i][j] = INF;

        Path[1][0] = 0;

        for (int i = 0;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))
                     Path[i][j] = Min(Path[i][j],Path[i ^ (1 << j)][k] + Dst(B[k],B[j]));

        /**for (int i = 0;i < (1 << N);i++){
            for (int j = 0;j < N;j++)fout << Path[i][j] << " ";
            fout << "\n";
        }**/

        if (Op == 1)
        {
            Sol = INF;

            for (int i = 0;i < N;i++)
                Sol = Min(Sol,Path[(1 << N) - 1][i]);

            fout << Sol << "\n";
        }

    }while(Op == 1);
}