Cod sursa(job #2285748)

Utilizator crastanRavariu Eugen crastan Data 19 noiembrie 2018 09:08:29
Problema Bibel Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("bibel.in");
ofstream fout("bibel.out");
#define INF 1000000
int n,i,j,x,y,k,sol,ult,vult;
struct punct{int x,y;}rep[20];
int nprev,lantPrev[20];
punct repprev[20];
int cost[20][20];
int lantMin[1<<17][19];
void reset()
{
    n=0;
    for(int i=0;i<20;i++)
        for(int j=0;j<20;j++)
            cost[i][j]=INF;
    for(int i=0;i<1<<17;i++)
        for(int j=0;j<20;j++)
            lantMin[i][j]=INF;
}
int mod(int x)
{
    if(x<0)return -x;
    return x;
}
void afis()
{
    for(int i=0;i<1<<n;i++)
        {
            cout<<i<<" ";
            for(int j=0;j<n;j++)
                if(lantMin[i][j]==INF)
                cout<<"x ";
            else
            cout<<lantMin[i][j]<<" ";
            cout<<endl;



        }
        cout<<endl;
}
int dist(punct a,punct b)
{
    return (a.y-b.y)*(a.y-b.y)+(a.x-b.x)*(a.x-b.x);
}
int main()
{
    reset();
    nprev=1;
    repprev[0].x=repprev[0].y=0;
    lantPrev[1]=0;
    while(fin>>k)
    {
        if(k==2)
            return 0;
        if(k==0)
            fin>>rep[n++].x>>rep[n].y;
        if(k==1)
        {
            for(i=0;i<=n;i++)
                for(j=i+1;j<=n;j++)
                        cost[i][j]=
                        cost[j][i]=dist(rep[i],rep[j]);
            for(i=0;i<n;i++)
                for(j=0;j<nprev;j++)
                {lantMin[1<<i][i]=min(lantMin[1<<i][i],dist(rep[i],repprev[j])+lantPrev[j]);}
            for(i=1;i<1<<17;i++)
                for(j=0;j<n;j++)
                if(i&(1<<j))
                    for(k=0;k<n;k++)
                    if(i&(1<<k))
                        lantMin[i][j]=min(lantMin[i][j],
                                          lantMin[i^(1<<j)][k]+cost[k][j]);
            //afis();
            sol=INF;
            for(i=0;i<n;i++)
                if(sol>lantMin[(1<<n)-1][i])
                {
                    sol=lantMin[(1<<n)-1][i];
                    ult=i;
                }
            fout<<sol<<'\n';
            nprev=n;
            for(i=0;i<n;i++)
            {
                lantPrev[i]=lantMin[(1<<n)-1][i];
                repprev[i]=rep[i];
            }
            reset();
        }
    }
    return 0;
}