1 条题解
-
0
解题思路
注意到,无论你如何给边标号,总存在一条路径会同时经过标号为 和标号为 的边,因此总存在一条路径的 MEX 至少为 。
如果某个节点的度数大于等于 ,你可以将标号 分配给与该节点关联的三条边,其余边任意分配剩余标号。
否则,这棵树是一条链(竹子树),此时无论如何标号,都会有一条路径的 MEX 达到 ,因此标号方式不影响结果。
代码实现
#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
- 上传者