Pagini recente » Cod sursa (job #2845019) | Cod sursa (job #1740686) | Cod sursa (job #3177880) | Cod sursa (job #233266) | Cod sursa (job #2641548)
#include <bits/stdc++.h>
using namespace std;
ifstream in("bibel.in");
ofstream out("bibel.out");
typedef long long ll;
const ll inf=9e18;
struct Op
{
ll x;
ll y;
ll ans;
};
vector<Op> last;
struct per
{
ll x;
ll y;
};
vector<per> v;
ll dp[18][(1<<17)];
ll term[18];
ll dist(ll x,ll y,ll xx,ll yy)
{
return (xx-x)*(xx-x)+(yy-y)*(yy-y);
}
vector<ll> used;
int main()
{
ll t,x,y;
last.push_back({0,0,0});
while(in>>t)
{
if(t==2) return 0;
if(t==0)
{
in>>x>>y;
v.push_back({x,y});
continue;
}
ll n=v.size();
for(ll i=0;i<n;++i)
dp[i][(1<<i)]=term[i]=inf;
for(auto f:last)
for(ll i=0;i<n;++i)
dp[i][(1<<i)]=min(dp[i][(1<<i)],f.ans+dist(f.x,f.y,v[i].x,v[i].y));
for(ll k=1;k<(1<<n);++k)
{
used.clear();
ll mask=k;
for(ll i=0;i<n;++i)
{
if(mask&1) used.push_back(i);
mask>>=1;
}
if(used.size()==1) continue;
for(auto a:used)
{
dp[a][k]=inf;
ll apel=k-(1<<a);
for(auto b:used) if(a!=b)
dp[a][k]=min(dp[a][k],dp[b][apel]+dist(v[b].x,v[b].y,v[a].x,v[a].y));
}
}
for(ll i=0;i<n;++i)
term[i]=min(term[i],dp[i][(1<<n)-1]);
ll nivel=inf;
for(ll i=0;i<n;++i)
nivel=min(nivel,term[i]);
out<<nivel<<'\n';
last.clear();
for(ll i=0;i<n;++i)
last.push_back({v[i].x,v[i].y,term[i]});
v.clear();
}
return 0;
}