Cod sursa(job #2552181)

Utilizator dogaru_roxanaDogaru Roxana dogaru_roxana Data 20 februarie 2020 17:30:00
Problema Bibel Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#define pinf 1000000007
using namespace std;

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

int z, n, d[132000][210], b[210][3], niv, aux, p, ant, dist[210][210], mini;

void rez_niv()
{
    int i, j, r;

    for (i=0; i<n; i++)
    {
        for (j=i+1; j<=n; j++)
        {
            dist[i][j]=dist[j][i]=(b[j][1]-b[i][1])*(b[j][1]-b[i][1])+(b[j][2]-b[i][2])*(b[j][2]-b[i][2]);
        }
    }

    aux=((1<<(n+1))-1);

    for (i=1; i<=aux; i++)
    {
        for (j=1; j<=n; j++)
            d[i][j]=pinf;
    }

    for (i=3; i<=aux; i=i+2)
    {
        for (j=1; j<=n; j++)
        {
            p=1<<j;

            if ((p&i)>0)
            {
                ant=i-p;

                if (ant==1)
                {
                    if (dist[0][j]<d[i][j])
                    {
                        d[i][j]=dist[0][j];
                    }
                }
                else
                {
                    for (r=1; r<=n; r++)
                    {
                        if (d[ant][r]+dist[r][j]<d[i][j])
                        {
                            d[i][j]=d[ant][r]+dist[r][j];
                        }
                    }
                }
            }
        }
    }

    mini=pinf;

    for (i=1; i<=n; i++)
    {
        if (d[aux][i]<mini)
            mini=d[aux][i];
    }

    fout<<mini<<'\n';
}

int main()
{
    n=0;
    niv=0;
    while (fin>>z)
    {
        if (z==0)
        {
            n++;
            fin>>b[n][1]>>b[n][2];
        }
        else
        {
            if (z==1)
            {
                niv++;
                rez_niv();
            }
        }
    }

    fin.close();
    fout.close();
    return 0;
}