やるだけ
const int N = 50 + 1;
vector<int> g[N];
bool T[N];
int f(int node)
{
int cost[node];
fill(cost, cost + node, 1 << 29);
cost[0] = 0;
queue<int> q;
for (int i = 1; i < (int)node; ++i) {
if (T[i]) {
q.push(i);
cost[i] = 0;
}
}
for (q.push(0); q.size(); q.pop()) {
int n = q.front();
each (i, g[n]) {
if (cost[*i] > cost[n] + 1) {
cost[*i] = cost[n] + 1;
q.push(*i);
}
}
}
return *max_element(cost, cost + node);
}
int rec(int i, int tc, int node)
{
if (tc == 0) return f(node);
int mn = 1 << 28;
for (; i < node; ++i) {
T[i] = true;
mn = min(mn, rec(i + 1, tc - 1, node));
T[i] = false;
}
return mn;
}
class TeleportsNetwork {
public:
int distribute(int tc, vector <int> X, vector <int> Y)
{
fill(T, T + N, false);
fill(g, g + N, vector<int>());
const int node = X.size();
double d[node][node];
for (int i = 0; i < (int)node; ++i) {
for (int j = 0; j < (int)node; ++j) {
double x = X[i] - X[j];
double y = Y[i] - Y[j];
d[i][j] = sqrt(x * x + y * y);
}
}
for (int i = 1; i < (int)node; ++i) {
double dist = 1e126;
int idx;
for (int j = 0; j < (int)node; ++j) {
if (d[0][i] < d[0][j]) continue;
if (i == j) continue;
if (d[i][j] < dist) {
dist = d[i][j];
idx = j;
}
if (dist == d[i][j]) {
if (X[j] < X[idx]) idx = j;
if (X[j] == X[idx] && Y[j] < Y[idx]) idx = j;
}
}
g[i].push_back(idx);
g[idx].push_back(i);
}
return rec(1, tc, node);
}
};