题解:P3388 【模板】割点(割顶)
提示:本篇题解缺乏详细的证明,如有需要,请移步其他题解。
算法介绍
Tarjan 算法,这里用来解决割点问题,时间复杂度为 \(O(n+m)\)。
割点的简要定义是:去掉割点及其所连的边,该图分为两个及以上的连通分量。
接下来讲的是定义与约定。
\(dfn_i\):称为“时间戳”标记,使用 dfs 第一次遍历到的次序。
搜索树:\(n\) 个点,\(n-1\) 条边搜索生成的树。
\(low_i\):称为“追溯值”,表示的是第 \(i\) 个点到以下点时间戳的最小值。
- 以 \(i\) 为根节点的生成树上的点。
- \(i\) 可以通过一条非树边到达的点。
考虑 \(low_i\) 的计算方法:
- 自己肯定可达,即 \(low_i=dfn_i\)。
- 若 \(j\) 为 \(i\) 在生成树上的子节点,则取 \(low_i=\min(low_i,low_j)\)。
- 若 \(j\) 到 \(i\) 为非树边,则根据定义,\(low_i=\min(low_i,dfn_j)\)。
更新 \(low\) 的伪代码如下:
if y is x's son
low_x=min(low_x,low_y)
else
low_x=min(low_x,dfn_y)
如何求割点?
tarjan 算法:
- 若 \(x\) 不为根节点,且 \(dfn_x \le low_y\),则 \(x\) 为割点。
由定义知,即不能回到祖先,那么 \(x\) 点是割点。
我们发现,此方法无法用于判断根节点,于是有下面的方法。
- 若 \(x\) 为根节点,且 \(x\) 有两颗以上的子树,则 \(x\) 为割点。
非常明显,删去后,整张图就分裂了。
正确性证明
显然。
代码实现
这里也应该讲解一下。
- \(dfn\) 和 \(low\) 数组初始全为 \(0\),这点其实也起到标记的作用。
- 在遇到没有访问过的节点时,要继续向下搜索。
- 每个点都有可能是根节点,因为图不连通。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,cnt,p;
vector<int>v[100005];
int dfn[100005],low[100005];
bool ans[100005];
void tarjan(int x,bool root){
int p=0;
dfn[x]=low[x]=++cnt;
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
if(!dfn[y]){
tarjan(y,0);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x]&&!root) ans[x]=1;
if(root) p++;
}
else{
low[x]=min(low[x],dfn[y]);
}
}
if(root&&p>=2) ans[x]=1;
return;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,vv;
cin>>u>>vv;
v[u].push_back(vv);
v[vv].push_back(u);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i,i);
}
int h=0;
for(int i=1;i<=n;i++){
if(ans[i]) h++;
}
cout<<h<<endl;
for(int i=1;i<=n;i++){
if(ans[i]) cout<<i<<" ";
}
return 0;
}
题解:P3388 【模板】割点(割顶)的更多相关文章
- Tarjan求割点(割顶) 割边(桥)
割点的定义: 感性理解,所谓割点就是在无向连通图中去掉这个点和所有和这个点有关的边之后,原先连通的块就会相互分离变成至少两个分离的连通块的点. 举个例子: 图中的4号点就是割点,因为去掉4号点和有关边 ...
- $割点割顶tarjan$
原题 #include <bits/stdc++.h> using namespace std; typedef long long LL; inline LL read () { LL ...
- 洛谷 P3388 割点(割顶) 题解
题面: 割点性质: 节点 u 如果是割点,当且仅当存在 u 的一个子树,子树中没有连向 u 的祖先的边(返祖边). 换句话说,如果对于一个点u,它的子节点是v,如果low[v] ...
- P3388 【模板】割点(割顶) 题解 (Tarjan)
题目链接 P3388 [模板]割点(割顶) 解题思路 最近学的东西太杂了,多写点博客免得自己糊里糊涂的过去了. 这个题求割点,感觉这篇文章写得挺好. 割点是啥?如果去掉这个点之后连通图变成多个不连通图 ...
- Tarjan求割点 || Luogu P3388 【模板】割点(割顶)
题面:P3388 [模板]割点(割顶) 题解:无 代码: #include<cstdio> #include<iostream> #include<cstring> ...
- P3388 【模板】割点(割顶)
P3388 [模板]割点(割顶) 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式 ...
- 洛谷 P3388 【模板】割点(割顶)(Tarjan)
题目链接 https://www.luogu.org/problemnew/show/P3388 模板题 解题思路 什么是割点? 怎样求割点? dfn :即时间戳,一张图的dfs序(dfs遍历时出现的 ...
- 图论算法-Tarjan模板 【缩点;割顶;双连通分量】
图论算法-Tarjan模板 [缩点:割顶:双连通分量] 为小伙伴们总结的Tarjan三大算法 Tarjan缩点(求强连通分量) int n; int low[100010],dfn[100010]; ...
- poj 1144 Network 图的割顶判断模板
Network Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8797 Accepted: 4116 Descripti ...
- POJ 1144 Network(无向图的割顶和桥模板题)
http://poj.org/problem?id=1144 题意: 给出图,求割点数. 思路: 关于无向图的割顶和桥,这篇博客写的挺不错,有不懂的可以去看一下http://blog.csdn.net ...
随机推荐
- Docker应用部署(Mysql、tomcat、Redis、redis)
Docker应用部署mysql5.7 1.拉取镜像 docker pull mysql:5.7 2.查看镜像 docker images 3.创建容器 docker run -id \ -p 3307 ...
- 全网最强 DeepSeek 插件上线!支持多家云服务,一键解锁满血版 AI
前言 自 DeepSeek 推出以来,其回答质量备受好评.然而,许多用户在连续提问时经常遇到"服务器繁忙,请稍后再试"的提示.随着各大云服务商陆续部署 DeepSeek 的完整模型 ...
- 07_读写文件open(filename, mode, encoding=None)
读写文件open(filename, mode, encoding=None) mode mode 权限 r 只读 w 只写(会从头开始覆盖覆盖写当前文件内容) a 追加写(从文件内容的末尾追加写内容 ...
- 移动端 cordova vue videojs 全屏播放后退出全屏返回后退出app问题
问题描述 移动端上面使用了videojs 播放视频,同时也监听了手机返回事件document.addEventListener('backbutton',.接着我们点击全屏播放后在退出全屏在返回后直接 ...
- 池化层 Pooling Layer
写在前面:人生就是努力.搞不懂.躺平,循环. 文章结构 池化层的相对位置 在多通道任务中,池化层和卷积层的不同 重要的参数stride 与 kernel_size 大小的相对关系决定3种池化层 参数 ...
- 超级详细的mysql数据库安装指南
https://zhuanlan.zhihu.com/p/37152572 2,073 人赞同了该文章 如果你的电脑是mac,参考社群会员 @奔跑的土豆 的分享: mac下mysql的安装步骤 227 ...
- mac上zsh环境变量如何配置
环境变量配置 在 macOS 上,如果你使用的是 zsh 作为默认的 shell,那么 /bin/zsh 的环境变量通常可以在以下文件中配置: ~/.zshrc ~/.zprofile ~/.zshe ...
- 深入理解Hadoop读书笔记-3
背景 公司的物流业务系统目前实现了使用storm集群进行过门事件的实时计算处理,但是还有一个需求,我们需要存储每个标签上传的每条明细数据,然后进行定期的标签报表统计,这个是目前的实时计算框架无法满足的 ...
- ArrayList的常用成员方法
1.ArrayList常用成员方法 可以大致分为4种,增 删 改 查 1.增 1.public boolean add(E e) 将括号里的元素直接添加到集合中,添加的元素按照顺序依次排列. 其中,E ...
- Oracle for 循环
Oracle for in loop 循环的一些实例,以作学习和加强使用熟练度及场景应用. 一些技巧 for 语句后面的 loop end loop 可以类比成 c#/java 等编程语言 for 语 ...