やるだけ
- 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);
- }
- };