Pagini recente » Cod sursa (job #1582197) | Cod sursa (job #3194834) | Cod sursa (job #2598741) | Cod sursa (job #3239570) | Cod sursa (job #2973153)
#include <bits/stdc++.h>
#define ll int64_t
using namespace std;
#if 1
ifstream fin("bibel.in");
ofstream fout("bibel.out");
#define cin fin
#define cout fout
#endif // 0
const int nmx = 17;
const int mskmx = 1 << 17;
ll a[nmx][nmx];
ll dp[1<<nmx][nmx];
const ll inf = 1e17;
int dist(array<int,2> p0,array<int,2> p1){
array<int,2> d = {p1[0]-p0[0],p1[1]-p0[1]};
return d[0]*d[0] + d[1]*d[1];
}
vector<vector<array<int,2>>> niv(1);
void resetDP(){
for(int i=0;i<mskmx;i++)
for(int j=0;j<nmx;j++)
dp[i][j] = inf;
}
int main(){
while(true){
int op;
cin >> op;
if(op == 2)
break;
else if(op == 1){
niv.push_back({});
continue;
}
int x,y;
cin >> x >> y;
niv.back().push_back({x,y});
}
niv.pop_back();
for(int h=0;h<niv.size();h++){
if(h){
vector<ll> last(niv[h-1].size());
const int mskn = 1 << last.size();
for(int i=0;i<last.size();i++){
last[i] = dp[mskn-1][i];
}
resetDP();
for(int i=0;i<niv[h].size();i++)
for(int j=0;j<last.size();j++)
dp[1<<i][i] = min(dp[1<<i][i],last[j] + dist(niv[h-1][j],niv[h][i]));
}
else {
resetDP();
for(int i=0;i<niv[h].size();i++)
dp[1<<i][i] = dist({0,0},niv[h][i]);
}
const int n = niv[h].size();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j] = dist(niv[h][i],niv[h][j]);
const int mskn = 1 << n;
for(int msk=0;msk<mskn;msk++){
for(int i=0;i<n;i++){
int bi = 1 << i;
if(msk&bi)
for(int j=0;j<n;j++)
dp[msk][i] = min(dp[msk][i],dp[msk^bi][j] + a[j][i]);
}
}
ll ans = inf;
for(int i=0;i<n;i++)
ans = min(ans,dp[mskn-1][i]);
cout << ans << "\n";
}
}