「2024 - 暑假 - Day-1 提高笔记-割点(割边)」
1.CSP考前2.「Day 1—递归问题」3.「Day 2—贪心问题&分治&前缀和」4.「Day 3—深度优先搜索 & 广度优先搜索」5.「Day 4—图的存储 & 图上搜索」6.「Day 5—最短路径」7.「Day 6—单调栈 & 单调队列 & 并查集」8.「Day 7—离散化 & 树状数组 & 线段树」9.「Day 8—最小生成树之Kruskal & Prim」10.「Day 9 & 10—DP问题」11.「Day 11 & 12 & 13 & 14—杂项」
12.「2024 - 暑假 - Day-1 提高笔记-割点(割边)」
13.「2024 - 暑假 - Day-2 提高笔记-字典树」14.【基础知识】15.「2024 - 暑假 - Day-3 提高笔记-ST表 & RMQ」16.「2024 - 暑假 - Day-4 提高笔记-LCA最近公共祖先」17.「2025 - 寒假 - Day-2 提高笔记-反悔贪心」割点(割边)
前置知识
首先是一些简单的基础。
- 连通分量:在无向图中其实就是相当于连通块。
序:利用 在树上遍历的过程。- 割点:去除这个点后这个图的连通块又增加了。
- 割边:去除这个边后这个图的连通块又增加了。
实现思路
如果我们在一个连通分量里面对任意一个点做
定理1:如果 是 的根节点,且 有大于等于 个子节点,那么 为割点。
同时我们仔细想一想,如果一个一般的点
定理2:如果 的非根节点 ,当且仅当 存在一个子节点 , 及其后代没有退回边连 的祖先,此时 为割点。
代码思路
根据定理1和定理2,我们应该如何编程实现呢?
设对于一个节点
- 对于我们的
序,用 数组来记录对每个点的访问顺序, 随着 的加深不断增大。 - 对于我们的退回思路,定义
表示 及其后代能回连到祖先的 值。如果 ,就说明 一定没有回连的边,那么 一定是割点。这就是 定理2。
有趣的割边
对于以上的思路:如果将
代码实现
P3388 【模板】割点(割顶)
#include<iostream>
#include<vector>
using namespace std;
const int MAXN = 2 * 1e4 + 5;
int low[MAXN], num[MAXN];
int tot = 0, n, m, ans = 0;
bool iscut[MAXN];
vector<int> G[MAXN];
void dfs(int u, int fa) {
low[u] = num[u] = ++tot;
int child = 0;
for (int v : G[u]) {
if (!num[v]) {
child++;
dfs(v, u);
low[u] = min(low[u], low[v]);//用后代的值更新一下
if (low[v] >= num[u] && u != fa) iscut[u] = true;//定理2
}
else if (num[v] < num[u] && v != fa) {//处理回连边
low[u] = min(low[u], num[v]);
}
}
if (u == fa && child >= 2) iscut[u] = true;//定理1
}
int main() {
cin >> n >> m;
for (int i = 1, u, v; i <= m; i++) {
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1; i <= n; i++) {
if (!num[i]) dfs(i, i);//题目中说图可能不联通
}
for (int i = 1; i <= n; i++) if (iscut[i]) ans++;
cout << ans << '\n';
for (int i = 1; i <= n; i++) if (iscut[i]) cout << i << ' ';
return 0;
}
本文来自一名初中牲,作者:To_Carpe_Diem
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!