Pagini recente » Cod sursa (job #3349679) | Cod sursa (job #3329795) | Cod sursa (job #3333333) | Cod sursa (job #3313638) | Cod sursa (job #3307346)
#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][19],dp[131072][19];
int main ()
{
int stop,nn,a,x,y,seg,mask,a1,z,a2;
long long 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;
}