Cod sursa(job #2005765)

Utilizator refugiatBoni Daniel Stefan refugiat Data 28 iulie 2017 06:45:29
Problema Bibel Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#define INF 1999999999
using namespace std;
ifstream si("bibel.in");
ofstream so("bibel.out");
int niv=1;
int x[20],y[20],x0[20],y0[20];
int n=0;
int dist(int x1,int y1,int x2,int y2)
{
    return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
int pr;
int d[1<<17][20];
int sol()
{
    if(niv==1)
        pr=n;
    for(int i=1;i<=(1<<n);++i)
        for(int j=0;j<n;++j)
            d[i][j]=INF;
    for(int j=0;j<pr; j++)
        for(int i=0;i<n;i++)
            d[1<<i][i]=min(d[1 << i][i],d[0][j]+dist(x[i],y[i],x0[j],y0[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)
                        d[i][j]=min(d[i][j],d[i^(1<<j)][k]+dist(x[k],y[k],x[j],y[j]));
    int ans=INF;
    for(int i=0;i<n;i++)
    {
        ans=min(ans,d[(1<<n)-1][i]);
        x0[i]=x[i];
        y0[i]=y[i];
        d[0][i]=d[(1<<n)-1][i];
    }
    pr=n;
    return ans;
}
int main()
{
    int a;
    bool done=false;
    while(!done)
    {
        si>>a;
        switch(a)
        {
            case 0:
            {
                si>>x[n]>>y[n];
                ++n;
                break;
            }
            case 1:
            {
                so<<sol()<<'\n';
                n=0;
                ++niv;
                break;
            }
            case 2: done=true; break;
        }
    }
    return 0;
}