rt。样例 2 输出 3。
#include <bits/stdc++.h>
using namespace std;
const int N = 21;
int f[1 << N], a[N], fa[N], cnt, now, qwq, n, k;
string u, v;
map<string, int> S;
// f[i] = i 状态下(1 是直属下属,0 不是)最少的代价
int dfs(int mask, int u) { // 求 mask 状态下 u 点到根的距离
if (mask & 1 << u) return u ? 1 : 0;
return dfs(mask, fa[u]) + 1;
}
int main() {
cin >> n >> k >> u, S[u] = cnt, now = qwq = 1; // now 是初始的状态,qwq 是初始是直属下属的人数
memset(f, 0x3f, sizeof f);
for (int i = 1; i < n; i ++) {
cin >> u >> v, S[u] = ++ cnt;
if (!(fa[cnt] = S[v])) now |= 1 << i, qwq ++;
}
f[now] = 0;
for (int i = 0; i < 1 << n; i ++) {
for (int j = 0; j < n; j ++)
if ((i & 1 << j) && ((i ^ 1 << j) & 1)) {
int s = i ^ 1 << j, t = __builtin_popcount(i) - qwq;
if (!(s & 1)) continue;
f[i] = min(f[i], f[s] + ((dfs(s, j) + t) & k));
}
}
cout << f[(1 << n) - 1] << '\n';
return 0;
}