Pagini recente » Cod sursa (job #1983901) | Cod sursa (job #137193) | Cod sursa (job #1690662) | Cod sursa (job #1157274) | Cod sursa (job #139202)
Cod sursa(job #139202)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define maxb 17
#define inf 2000000000
vector <int> vx;
vector <int> vy;
vector <int> precx;
vector <int> precy;
vector <int> precd;
vector <int> vdist;
int c,x,y;
int dt(int a,int b)
{
return ((vx[a]-vx[b])*(vx[a]-vx[b])+(vy[a]-vy[b])*(vy[a]-vy[b]));
}
int dt2(int a,int b)
{
return ((vx[a]-precx[b])*(vx[a]-precx[b])+(vy[a]-precy[b])*(vy[a]-precy[b]));
}
void proc()
{
int v[1<<maxb][maxb];
int i,j;
for (i=0; i<(1<<(int)vx.size()); ++i)
{
for (j=0; j<(int)vx.size(); ++j)
{
v[i][j]=inf;
}
}
int mn,x;
for (i=0; i<(int)vx.size(); ++i)
{
for (j=0; j<(int)precx.size(); ++j)
{
mn=v[1<<i][i];
x=dt2(i,j) +precd[j];
if (mn>x) mn=x;
v[1<<i][i]=mn;
}
}
int d[maxb][maxb];
for (i=0; i<(int)vx.size(); ++i)
{
for (j=0; j<(int)vx.size(); ++j)
{
d[i][j]=dt(i,j);
}
}
for (i=0; i<(1<<(int)vx.size()); ++i)
{
int t[maxb],cnt=0;
for (j=0; j<(int)vx.size(); ++j)
{
if (i & (1<<j))
{
t[cnt++]=j;
}
}
if (cnt>1)
for (j=0; j<cnt; ++j)
{
i^=1<<t[j];
int mn=inf;
for (int k=0; k<cnt; ++k)
{
if (k==j) continue;
mn=v[i ^ (1<<t[j])][t[j]];
if (mn>v[i][t[k]]+d[t[k]][t[j]]) mn=v[i][t[k]]+d[t[k]][t[j]];
v[i ^ (1<<t[j])][t[j]]=mn;
}
i^=1<<t[j];
}
}
mn=inf;
for (i=0; i<(int)vx.size(); ++i)
{
vdist.push_back(v[(1<<(int)vx.size())-1][i]);
if (mn>vdist[i]) mn=vdist[i];
}
printf("%d\n",mn);
}
int main()
{
freopen("bibel.in","r",stdin);
freopen("bibel.out","w",stdout);
precx.push_back(0);
precy.push_back(0);
precd.push_back(0);
while (1)
{
scanf("%d",&c);
if (c==0)
{
scanf("%d%d",&x,&y);
vx.push_back(x);
vy.push_back(y);
}
if (c==2) return 0;
if (c==1)
{
proc();
precx.clear();
precy.clear();
precd.clear();
for (int i=1; i<=(int)vx.size(); ++i)
{
precx.push_back(vx[i]);
precy.push_back(vy[i]);
precd.push_back(vdist[i]);
}
vx.clear();
vy.clear();
vdist.clear();
}
}
}