Pagini recente » Cod sursa (job #1008541) | Cod sursa (job #497875) | Cod sursa (job #1179477) | Cod sursa (job #2881244) | Cod sursa (job #954774)
Cod sursa(job #954774)
#include<fstream>
#define INF 999999999
#define punct pair<int,int>
#define x first
#define y second
using namespace std;
ifstream f("bibel.in");
ofstream g("bibel.out");
int op,n,rez,pred,i,j,conf,d[20],c[20][20],sol[1<<18][20];
punct p[20],pt[20];
inline int dist(punct a,punct b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int main()
{
pred=1;
while(1)
{
f>>op;
if(op==2)
return 0;
else
if(op==0)
f>>p[n].x>>p[n].y,++n;
else
{
for(i=0;i<n;++i)
for(j=0;j<n;++j)
c[i][j]=dist(p[i],p[j]);
for(conf=0;conf<(1<<n);++conf)
for(i=0;i<n;++i)
sol[conf][i]=INF;
for(i=0;i<pred;++i)
for(j=0;j<n;++j)
sol[1<<j][j]=min(sol[1<<j][j],d[i]+dist(pt[i],p[j]));
for(conf=0;conf<(1<<n);++conf)
for(i=0;i<n;++i)
if(conf&(1<<i))
for(j=0;j<n;++j)
if(!(conf&(1<<j))&&sol[conf+(1<<j)][j]>sol[conf][i]+c[i][j])
sol[conf+(1<<j)][j]=sol[conf][i]+c[i][j];
rez=INF;
for(i=0;i<n;++i)
{
d[i]=sol[(1<<n)-1][i];
rez=min(rez,d[i]);
pt[i]=p[i];
}
g<<rez<<'\n';
pred=n;
n=0;
}
}
}