2 条题解
-
1
可以贪心,固定最大距离为 ,数有多少个 满足 且 ,这些 互相之间的距离也会 。
证明:
设满足条件的 构成集合
都有:
当 且 时, 不可能是 或 的儿子(以 为根)。
所以上述不等式可以转化为:
- $dis_{i,lca_{i,j}}+dis_{k_1,lca_{i,j}}\leq dis_{i,lca_{i,j}}+dis_{j,lca_{i,j}}$
- $dis_{j,lca_{i,j}}+dis_{k_2,lca_{i,j}}\leq dis_{i,lca_{i,j}}+dis_{j,lca_{i,j}}$
$\therefore dis_{k_1,k_2}=dis_{k_1,lca_{i,j}}+dis_{k_2,lca_{i,j}}\leq dis_{i,lca_{i,j}}+dis_{j,lca_{i,j}}=dis_{i,j}$
代码:
注意特判 ,此时答案为 。
// Sam的素描作品 #include <iostream> #include <vector> #include <algorithm> using namespace std; int n, m, s, ans; vector<int> tr[105], a, dis[105]; void dfs(int u, int fa) { for (int v : tr[u]) { if (v == fa) continue; dis[s][v] = dis[s][u] + 1; dfs(v, u); } } int main() { cin >> n >> m; a.resize(n + 5); for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1, u, v; i < n; i++) { cin >> u >> v; tr[u].push_back(v); tr[v].push_back(u); } for (int i = 1; i <= n; i++) { s = i; dis[s].resize(n + 5); dfs(i, 0); } ans = n - 1; for (int i = 1; i <= n; i++) { if (!a[i]) continue; for (int j = i + 1; j <= n; j++) { if (!a[j]) continue; int cnt = 0; for (int k = 1; k <= n; k++) if (a[k] && (cnt += (dis[i][k] <= dis[i][j] && dis[j][k] <= dis[i][j])) >= m) break; if (cnt >= m) ans = min(ans, dis[i][j]); } } if (m == 1) ans = 0; cout << ans << '\n'; return 0; }
信息
- ID
- 2689
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 13
- 已通过
- 3
- 上传者