Pagini recente » Cod sursa (job #3039363) | Cod sursa (job #2695942) | Cod sursa (job #1379725) | Cod sursa (job #2983222) | Cod sursa (job #2676560)
#include <iostream>
#include <fstream>
#define inf 2000000000
using namespace std;
ifstream f("bibel.in");
ofstream g("bibel.out");
int n = 0, dp[(1<<17)+10][17];
pair <int, int> v[20];
int dist(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) val = dist(0, bit+1);
else
{ for(int bit1=0; bit1<n; bit1++)
if(bit1 != bit && (mask & (1 << bit1)))
val = min(val, dp[mask^(1<<bit)][bit1] + dist(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]);
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();
n = 0;
}
else return 0;
}
return 0;
}