Cod sursa(job #2285698)

Utilizator crastanRavariu Eugen crastan Data 18 noiembrie 2018 22:50:14
Problema Bibel Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 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;
struct punct{int x,y;}rep[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 main()
{
    reset();
    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]=(rep[i].y-rep[j].y)*(rep[i].y-rep[j].y)+
                                   (rep[i].x-rep[j].x)*(rep[i].x-rep[j].x);
            for(i=0;i<n;i++)
                lantMin[1<<i][i]=0;
            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++)
                sol=min(sol,
                        lantMin[(1<<n)-1][i]);
            fout<<sol<<'\n';
           // reset();
        }
    }
    return 0;
}