Cod sursa(job #2551473)

Utilizator dogaru_roxanaDogaru Roxana dogaru_roxana Data 19 februarie 2020 21:01:44
Problema Bibel Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>
#define pinf 1000000007
using namespace std;

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

int z, n, d[132000][20], b[210][3], niv, nbniv[210], aux, p, ant, dist[210][210], auxant, rez[210], p2;

int main()
{
    int i, j, k, r;

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

    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]);
        }
    }

    rez[0]=0;

    for (k=1; k<=niv; k++)
    {
        aux=((1<<(nbniv[k]+1))-1);

        for (i=auxant; i<=aux; i++)
        {
            for (j=0; j<=nbniv[k]; j++)
            {
                d[i][j]=pinf;

                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=0; r<=nbniv[k]; r++)
                        {
                            p2=1<<r;
                            if ((p2&ant)>0)
                            {
                                if (d[ant][r]+dist[r][j]<d[i][j])
                                {
                                    d[i][j]=d[ant][r]+dist[r][j];
                                }
                            }
                        }
                    }
                }
            }
        }

        rez[k]=pinf;

        for (r=0; r<=nbniv[k]; r++)
        {
            if (rez[auxant]+d[aux][r]<rez[k])
            {
                rez[k]=rez[auxant]+d[aux][r];
            }
        }

        fout<<rez[k]<<'\n';

        auxant=aux;
    }

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