Pagini recente » Cod sursa (job #679552) | Cod sursa (job #3233174) | Cod sursa (job #194272) | Cod sursa (job #2708654) | Cod sursa (job #2676762)
#include <iostream>
#include <fstream>
#define inf 2000000000
using namespace std;
ifstream f("bibel.in");
ofstream g("bibel.out");
int n = 0, t, dp[(1<<17)+10][17];
pair <int, int> v[20], pr[20];
int dist1(int i, int j)
{ return (v[i].first - pr[j].first) * (v[i].first - pr[j].first) + (v[i].second - pr[j].second) * (v[i].second - pr[j].second);
}
int dist2(int i, int j)
{ return (v[i].first - v[j].first) * (v[i].first - v[j].first) + (v[i].second - v[j].second) * (v[i].second - v[j].second);
}
void solve()
{ for(int mask=1; mask<(1<<n); mask++)
for(int bit=0; bit<n; bit++)
if(mask & (1 << bit))
{ int val = inf;
if(__builtin_popcount(mask) == 1)
{ for(int bit1=0; bit1<n; bit1++)
val = min(val, dist1(bit+1, bit1+1) + dp[0][bit1]);
}
else
{ for(int bit1=0; bit1<n; bit1++)
if(bit1 != bit && (mask & (1 << bit1)))
val = min(val, dp[mask^(1<<bit)][bit1] + dist2(bit1+1, bit+1));
}
dp[mask][bit] = val;
}
int ans = inf;
for(int i=0; i<n; i++) ans = min(ans, dp[(1<<n)-1][i]), dp[0][i] = dp[(1<<n)-1][i];
g << ans << '\n';
}
int main()
{
v[0] = {0, 0};
while(1)
{ int type;
f >> type;
if(!type)
n++, f >> v[n].first >> v[n].second;
else if(type == 1)
{ solve();
for(int i=1; i<=n; i++) pr[i] = v[i];
n = 0;
}
else return 0;
}
return 0;
}