Pagini recente » Cod sursa (job #2760928) | Cod sursa (job #213094) | Cod sursa (job #2608229) | Cod sursa (job #1117366) | Cod sursa (job #2285748)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("bibel.in");
ofstream fout("bibel.out");
#define INF 1000000
int n,i,j,x,y,k,sol,ult,vult;
struct punct{int x,y;}rep[20];
int nprev,lantPrev[20];
punct repprev[20];
int cost[20][20];
int lantMin[1<<17][19];
void reset()
{
n=0;
for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
cost[i][j]=INF;
for(int i=0;i<1<<17;i++)
for(int j=0;j<20;j++)
lantMin[i][j]=INF;
}
int mod(int x)
{
if(x<0)return -x;
return x;
}
void afis()
{
for(int i=0;i<1<<n;i++)
{
cout<<i<<" ";
for(int j=0;j<n;j++)
if(lantMin[i][j]==INF)
cout<<"x ";
else
cout<<lantMin[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
int dist(punct a,punct b)
{
return (a.y-b.y)*(a.y-b.y)+(a.x-b.x)*(a.x-b.x);
}
int main()
{
reset();
nprev=1;
repprev[0].x=repprev[0].y=0;
lantPrev[1]=0;
while(fin>>k)
{
if(k==2)
return 0;
if(k==0)
fin>>rep[n++].x>>rep[n].y;
if(k==1)
{
for(i=0;i<=n;i++)
for(j=i+1;j<=n;j++)
cost[i][j]=
cost[j][i]=dist(rep[i],rep[j]);
for(i=0;i<n;i++)
for(j=0;j<nprev;j++)
{lantMin[1<<i][i]=min(lantMin[1<<i][i],dist(rep[i],repprev[j])+lantPrev[j]);}
for(i=1;i<1<<17;i++)
for(j=0;j<n;j++)
if(i&(1<<j))
for(k=0;k<n;k++)
if(i&(1<<k))
lantMin[i][j]=min(lantMin[i][j],
lantMin[i^(1<<j)][k]+cost[k][j]);
//afis();
sol=INF;
for(i=0;i<n;i++)
if(sol>lantMin[(1<<n)-1][i])
{
sol=lantMin[(1<<n)-1][i];
ult=i;
}
fout<<sol<<'\n';
nprev=n;
for(i=0;i<n;i++)
{
lantPrev[i]=lantMin[(1<<n)-1][i];
repprev[i]=rep[i];
}
reset();
}
}
return 0;
}