1 条题解
-
0
题目分析
这是一个图论+并查集问题,要求删除最少的边,使得编号 的点不在任何简单环上。
算法思路
核心思想
使用并查集维护连通性,分两阶段处理边:
- 第一阶段:连接两个端点都 的边(这些边安全,不会让关键点形成环)
- 第二阶段:处理涉及关键点的边,如果连接会形成环就删除
代码逻辑分析
int main() { // 初始化并查集 for (int i = 1; i <= n; i++) fa[i] = i; // 第一阶段:连接两个端点都 > k 的边 for (int i = 1; i <= m; i++) { int u = read(), v = read(); e[i][0] = u, e[i][1] = v; if (u > k && v > k) merge(u, v); // 安全边,直接连接 } // 第二阶段:处理涉及关键点的边 for (int i = 1; i <= m; i++) { int u = e[i][0], v = e[i][1]; if (u > k && v > k) // 已处理过,跳过 continue; int x = find(u), y = find(v); if (x == y) // 会形成环,删除这条边 ans++, vt.push_back(i); else // 不会形成环,连接 fa[x] = y; } }正确性证明
为什么这个策略能得到最优解?
- 安全性:两个端点都 的边不会让关键点形成环,所以优先连接
- 最小性:只有当连接会形成环时才删除边,保证了删除边数最少
- 可行性:删除这些边后,关键点确实不在任何环上
样例验证
输入:
11 13 5 1 2 1 3 1 5 3 5 2 8 4 11 7 11 6 10 6 9 2 3 8 9 5 9 9 10处理过程:
第一阶段:连接边 (端点都 )
第二阶段:
- ✓ 连接
- ✓ 连接
- ✓ 连接
- ✗ 形成环 → 删除
- ✓ 连接
- ✓ 连接
- ✓ 连接
- ✗ 形成环 → 删除
- ✗ 形成环 → 删除
输出:
3 2 3 5 9 3 5复杂度分析
-
时间复杂度:
- 是反阿克曼函数,近似常数
- 对 条边进行并查集操作
-
空间复杂度:
- 存储并查集和边列表
关键优化点
- 两阶段处理:先处理安全边,减少后续判断的复杂度
- 避免重复:第二阶段跳过已处理的安全边
- 输出格式:保证输出时小编号在前
适用场景
这种方法适用于:
- 大规模图数据()
- 需要快速判断环的存在性
- 要求最小化删除边数
总结
该解法通过巧妙的分阶段并查集策略,高效地解决了关键点去环问题,既保证了正确性,又具有优秀的时空复杂度。
- 1
信息
- ID
- 3846
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 11
- 已通过
- 1
- 上传者