2 条题解

  • 1
    @ 2026-10-1 21:35:01

    可以贪心,固定最大距离为 disi,jdis_{i,j},数有多少个 kk 满足 disi,k≤disi,jdis_{i,k}\leq dis_{i,j} 且 disj,k≤disi,jdis_{j,k}\leq dis{i,j},这些 kk 互相之间的距离也会 ≤disi,j\leq dis_{i,j}。

    证明:

    设满足条件的 kk 构成集合 KK

    ∀k1,k2∈K\forall k_1,k_2\in K 都有:

    • disi,k1≤disi,jdis_{i,k_1}\leq dis_{i,j}
    • disj,k2≤disi,jdis_{j,k_2}\leq dis_{i,j}

    当 disi,k≤disi,jdis_{i,k}\leq dis_{i,j} 且 disj,k≤disi,jdis_{j,k}\leq dis{i,j} 时,kk 不可能是 ii 或 jj 的儿子(以 lcai,jlca_{i,j} 为根)。

    所以上述不等式可以转化为:

    • $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}$

    代码:

    注意特判 m=1m=1,此时答案为 00。

    // 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
    上传者