1 条题解

  • 0
    @ 2026-5-4 11:25:13

    解题思路

    注意到,无论你如何给边标号,总存在一条路径会同时经过标号为 00 和标号为 11 的边,因此总存在一条路径的 MEX 至少为 22
    如果某个节点的度数大于等于 33,你可以将标号 0,1,20, 1, 2 分配给与该节点关联的三条边,其余边任意分配剩余标号。
    否则,这棵树是一条链(竹子树),此时无论如何标号,都会有一条路径的 MEX 达到 n1n-1,因此标号方式不影响结果。


    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        cin >> n;
    
        vector<vector<int>> g(n + 1);
        vector<pair<int, int>> edges(n - 1);
    
        for (int i = 0; i < n - 1; ++i) {
            int u, v;
            cin >> u >> v;
            edges[i] = {u, v};
            g[u].push_back(i);
            g[v].push_back(i);
        }
    
        // 找到度数 >= 3 的节点
        int node = -1;
        for (int i = 1; i <= n; ++i) {
            if (g[i].size() >= 3) {
                node = i;
                break;
            }
        }
    
        vector<int> ans(n - 1, -1);
        int cur = 0;
    
        if (node != -1) {
            // 给与该节点相连的边分配 0, 1, 2
            for (int idx : g[node]) {
                ans[idx] = cur++;
                if (cur == 3) break;
            }
        }
    
        // 给剩余的边分配剩余的数字
        for (int i = 0; i < n - 1; ++i) {
            if (ans[i] == -1) {
                ans[i] = cur++;
            }
        }
    
        for (int i = 0; i < n - 1; ++i) {
            cout << ans[i] << '\n';
        }
    
        return 0;
    }
    • 1

    信息

    ID
    6778
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者