Pagini recente » Cod sursa (job #1571334) | Cod sursa (job #1624939) | Cod sursa (job #3938) | Cod sursa (job #2212497) | Cod sursa (job #2088403)
#include <fstream>
#define INF 1e9
using namespace std;
ifstream f("bibel.in");
ofstream g("bibel.out");
int n, dp[(1<<17) + 15][17], kk, cnt, tip;
struct bilele{
int x, y;
}bila[18];
int test(int sub, int x){
return !(sub & (1<<x));
}
int dist(int x, int y, int x2, int y2){
return (x - x2) * (x - x2) + (y - y2) * (y - y2);
}
void solve(){
for(int i = 1; i <= kk; ++ i)
for(int j = 0; j < cnt; ++ j)
dp[i][j] = INF;
for(int i = 0; i < cnt; ++ i){
dp[(1<<i)][i] = dist(0, 0, bila[i].x, bila[i].y);
}
for(int i = 1; i <= kk ; ++ i){
for(int j = 0; j < cnt; ++ j){
if(!test(i, j)){
for(int k = 0; k < cnt; ++ k){
if(test(i, k)){
dp[i + (1<<k)][k] = min(dp[i + (1<<k)][k], dp[i][j] + dist(bila[j].x, bila[j].y, bila[k].x, bila[k].y));
}
}
}
}
}
}
int main()
{
while(true){
f>>tip;
if(tip == 0){
f>>bila[cnt].x>>bila[cnt].y;
++ cnt;
}
if(tip == 1){
-- cnt;
kk = (1<<cnt) - 1;
solve();
int minim = INF + 10;
for(int i = 0; i < cnt; ++ i)
minim = min (minim, dp[kk][i]);
g<<minim<<'\n';
cnt = 0;
}
if(tip == 2)
return 0;
}
return 0;
}