Cod sursa(job #2553265)

Utilizator dogaru_roxanaDogaru Roxana dogaru_roxana Data 21 februarie 2020 20:04:25
Problema Bibel Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 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, aux, p, ant, dist[210][210], mini, nr, inc, rez[20], nbant, incant, p2;

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

    if (niv==1)
    {
        n=nr+1;
    }
    else
    {
        n=nr-inc+1;
    }

    for (i=0; i<nr; i++)
    {
        for (j=i+1; j<=nr; 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);

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

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

            if ((p&i)>0)
            {
                ant=i-p;
                    if (ant==0)
                    {
                        for (r=0; r<nbant; r++)
                        {
                            if (rez[r]+dist[r+incant][j+inc]<d[i][j])
                            {
                                d[i][j]=rez[r]+dist[r+incant][j+inc];
                            }
                        }
                    }
                    else
                    for (r=0; r<n; r++)
                    {
                        if (d[ant][r]+dist[r+inc][j+inc]<d[i][j])
                        {
                            d[i][j]=d[ant][r]+dist[r+inc][j+inc];
                        }
                    }
            }
        }
    }

    mini=pinf;

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

            rez[i]=d[aux][i];

    }

    fout<<mini<<'\n';

    nbant=n;
    incant=inc;
}

int main()
{
    n=0;
    niv=0;
    inc=0;
    nbant=1;

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

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