Cod sursa(job #3307342)

Utilizator informatica1218alexia petre informatica1218 Data 20 august 2025 12:37:21
Problema Bibel Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include "bits/stdc++.h"
using namespace std;
ifstream f ("bibel.in");
ofstream g ("bibel.out");
struct coord
{
    int x,y;
};
int segment (int xa,int ya,int xb,int yb)
{
    return (xb-xa)*(xb-xa)+(ya-yb)*(ya-yb);
}
coord v[102][20];
int n[102];
long long d[102][20],dp[131074][20];
int main ()
{
    long long stop,nn,a,x,y,seg,mask,a1,z,a2,min1;
    stop=0;nn=1;n[1]=0;
    while (stop==0)
    {
        f>>a;
        if (a==0)
        {
            f>>x>>y;
            n[nn]++;
            v[nn][n[nn]].x=x;
            v[nn][n[nn]].y=y;
        }
        else if (a==1)
        {
            nn++;
            n[nn]=0;
        }
        else if (a==2)
        {
            stop=1;
        }
    }
    nn--;
    n[0]=1;
    v[0][n[0]].x=0;
    v[0][n[0]].y=0;
    d[0][n[0]]=0;
    for (x=1;x<=nn;x++)
    {
       a1=1<<n[x];
       for (mask=1;mask<a1;mask++)
       {
           for (y=1;y<=n[x];y++)
           {
               dp[mask][y]=3400000000;
           }
       }
       for (mask=1;mask<a1;mask++)
       {
           for (y=1;y<=n[x];y++)
           {
               a=1<<(y-1);
               if (mask&a)
               {
                  if (mask-a==0)
                  {
                      for (z=1;z<=n[x-1];z++)
                      {
                          seg=segment(v[x][y].x,v[x][y].y,v[x-1][z].x,v[x-1][z].y);
                          dp[mask][y]=min (dp[mask][y],d[x-1][z]+seg);
                      }
                  }
                  else
                  {
                      for (z=1;z<=n[x];z++)
                      {
                          a2=1<<(z-1);
                          if ((mask-a)&a2)
                          {
                             seg=segment(v[x][y].x,v[x][y].y,v[x][z].x,v[x][z].y);
                             dp[mask][y]=min (dp[mask][y],dp[mask-a][z]+seg);
                          }
                      }
                  }
               }
           }
       }
       a1=1<<n[x];
       min1=3400000000;
       for (y=1;y<=n[x];y++)
       {
           min1=min(min1,dp[a1-1][y]);
           d[x][y]=dp[a1-1][y];
       }
       g<<min1<<endl;
    }
    f.close ();
    g.close ();
    return 0;
}