Pagini recente » Cod sursa (job #854762) | Cod sursa (job #139347) | Cod sursa (job #521147) | Cod sursa (job #161322) | Cod sursa (job #976268)
Cod sursa(job #976268)
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <utility>
#include <string.h>
using namespace std;
ifstream cin("bibel.in");
ofstream cout("bibel.out");
const int MAXN = 20;
const int oo = (1<<31)-1;
int op, x, y, N, predN, D[MAXN], Ans, Cost[MAXN][MAXN], DP[1<<18][20], pred;
vector< pair<int, int> > V, Ant;
vector< int > Cant;
inline int Distance(pair<int, int> &a, pair<int, int> &b){
return (a.first - b.first)*(a.first - b.first) + (a.second - b.second)*(a.second - b.second);
}
inline void Solve(){
int N = V.size(),
M = (1 << N);
for(int i = 0 ; i < N ; ++ i)
for(int j = 0 ; j < N ; ++ j)
Cost[i][j] = Distance(V[i], V[j]);
for(int i = 0 ; i < M ; ++ i)
for(int j = 0 ; j < N ; ++ j)
DP[i][j] = oo;
for(int i = 0 ; i < N ; ++ i)
for(int j = 0 ; j < Ant.size() ; ++ j)
DP[(1 << i)][i] = min ( DP[(1 << i)][i], Cant[j] + Distance(V[i], Ant[j]));
for(int i = 0 ; i < M ; ++ i)
for(int j = 0 ; j < N ; ++ j)
if(i & ( 1<<j ))
for(int k = 0 ; k < N ; ++ k)
if(i & ( 1<<k ))
DP[i][j] = min( DP[i][j] , DP[i ^ (1<<j)][k] + Cost[k][j]);
Ans = oo;
Ant.clear();
Cant.clear();
for(int i = 0 ; i < N ; ++ i){
Ans = min (Ans, DP[M-1][i]);
Ant.push_back(V[i]);
Cant.push_back(DP[M-1][i]);
}
V.clear();
cout << Ans << "\n";
}
int main() {
Ant.push_back(make_pair(0, 0));
Cant.push_back(0);
for(cin >> op ; op != 2 ; cin >> op){
if(op)
Solve();
else {
int X, Y;
cin >> X >> Y;
V.push_back(make_pair(X, Y));
}
}
cin.close();
cout.close();
return 0;
}