提示:本篇题解缺乏详细的证明,如有需要,请移步其他题解。

算法介绍

Tarjan 算法,这里用来解决割点问题,时间复杂度为 \(O(n+m)\)。

割点的简要定义是:去掉割点及其所连的边,该图分为两个及以上的连通分量。

接下来讲的是定义与约定。

\(dfn_i\):称为“时间戳”标记,使用 dfs 第一次遍历到的次序。

搜索树:\(n\) 个点,\(n-1\) 条边搜索生成的树。

\(low_i\):称为“追溯值”,表示的是第 \(i\) 个点到以下点时间戳的最小值。

  1. 以 \(i\) 为根节点的生成树上的点。
  2. \(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 算法:

  1. 若 \(x\) 不为根节点,且 \(dfn_x \le low_y\),则 \(x\) 为割点。

由定义知,即不能回到祖先,那么 \(x\) 点是割点。

我们发现,此方法无法用于判断根节点,于是有下面的方法。

  1. 若 \(x\) 为根节点,且 \(x\) 有两颗以上的子树,则 \(x\) 为割点。

非常明显,删去后,整张图就分裂了。

正确性证明

显然。

代码实现

这里也应该讲解一下。

  1. \(dfn\) 和 \(low\) 数组初始全为 \(0\),这点其实也起到标记的作用。
  2. 在遇到没有访问过的节点时,要继续向下搜索。
  3. 每个点都有可能是根节点,因为图不连通。
#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 【模板】割点(割顶)的更多相关文章

  1. Tarjan求割点(割顶) 割边(桥)

    割点的定义: 感性理解,所谓割点就是在无向连通图中去掉这个点和所有和这个点有关的边之后,原先连通的块就会相互分离变成至少两个分离的连通块的点. 举个例子: 图中的4号点就是割点,因为去掉4号点和有关边 ...

  2. $割点割顶tarjan$

    原题 #include <bits/stdc++.h> using namespace std; typedef long long LL; inline LL read () { LL ...

  3. 洛谷 P3388 割点(割顶) 题解

    题面:     割点性质:     节点 u 如果是割点,当且仅当存在 u 的一个子树,子树中没有连向 u 的祖先的边(返祖边).     换句话说,如果对于一个点u,它的子节点是v,如果low[v] ...

  4. P3388 【模板】割点(割顶) 题解 (Tarjan)

    题目链接 P3388 [模板]割点(割顶) 解题思路 最近学的东西太杂了,多写点博客免得自己糊里糊涂的过去了. 这个题求割点,感觉这篇文章写得挺好. 割点是啥?如果去掉这个点之后连通图变成多个不连通图 ...

  5. Tarjan求割点 || Luogu P3388 【模板】割点(割顶)

    题面:P3388 [模板]割点(割顶) 题解:无 代码: #include<cstdio> #include<iostream> #include<cstring> ...

  6. P3388 【模板】割点(割顶)

    P3388 [模板]割点(割顶) 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式 ...

  7. 洛谷 P3388 【模板】割点(割顶)(Tarjan)

    题目链接 https://www.luogu.org/problemnew/show/P3388 模板题 解题思路 什么是割点? 怎样求割点? dfn :即时间戳,一张图的dfs序(dfs遍历时出现的 ...

  8. 图论算法-Tarjan模板 【缩点;割顶;双连通分量】

    图论算法-Tarjan模板 [缩点:割顶:双连通分量] 为小伙伴们总结的Tarjan三大算法 Tarjan缩点(求强连通分量) int n; int low[100010],dfn[100010]; ...

  9. poj 1144 Network 图的割顶判断模板

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8797   Accepted: 4116 Descripti ...

  10. POJ 1144 Network(无向图的割顶和桥模板题)

    http://poj.org/problem?id=1144 题意: 给出图,求割点数. 思路: 关于无向图的割顶和桥,这篇博客写的挺不错,有不懂的可以去看一下http://blog.csdn.net ...

随机推荐

  1. Top-N推荐算法 Top-N recommendation Algorithms

    引言 推荐算法是计算机专业中的一种算法,通过一些计算,能够推测用户喜欢的东西,在互联网环境中应用比较广泛.Top-N算法在生活中非常常见,比如学术论文推荐论文.音乐软件推荐歌曲等. 今天看到一篇名叫& ...

  2. Amazon S3 概念及如何集成到 .net 8 C#

    Amazon S3(Simple Storage Service)是一个高度可扩展.数据可用性高.安全性强的对象存储服务. Amazon S3 使用对象存储架构,数据以对象的形式存储在桶(bucket ...

  3. next.js 添加 PWA 渐进式WEB应用(service-worker) 支持

    本文仅作为 next 系列文章中的一部分,其他 next 文章参考: https://blog.jijian.link/categories/nextjs/ 去 github 搜索了一把,估计是我关键 ...

  4. Qt 实现带阴影 无边框的QMessageBox

    Qt 实现带阴影的QMessagebox 在实际项目里面使用到了QMessageBox做一个弹窗,最开始是样式不是需要的样式,就去找了一下QMessageBox的样式表,一般来说可以使用findChi ...

  5. 工作必会的Nginx的启动安装和常用配置例子

    概述 由于自己的之前学习 nginx 只会简单使用,然后每次配置 nginx 都要找文档去了解怎么配置,有点麻烦,所以这里记录下一些常用的nginx 配置和配置的例子,到时候直接 copy 修改即可. ...

  6. C++判断文本编码

    #include <iostream> #include <fstream> #include <string> #include <sstream> ...

  7. RabbitMQ集群部署(一)——单机模式部署

    本文分享自天翼云开发者社区<RabbitMQ集群部署(一)--单机模式部署>,作者:芋泥麻薯 RabbitMQ是一种开源消息队列系统,是AMQP的标准实现,用erlang语言开发.Rabb ...

  8. 面试题-Java基础(新更新版)

    前言 Java基础部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,希望对大家起到一定的帮助. 修改记录 日期 修改内容 ...

  9. Netty源码—9.性能优化和设计模式

    大纲 1.Netty的两大性能优化工具 2.FastThreadLocal的实现之构造方法 3.FastThreadLocal的实现之get()方法 4.FastThreadLocal的实现之set( ...

  10. FastAPI 核心功能的完整示例代码,涵盖 WebSocket、后台任务、生命周期事件、中间件配置及会话管理

    以下是一个整合 FastAPI 核心功能的完整示例代码,涵盖 WebSocket.后台任务.生命周期事件.中间件配置及会话管理.代码结构参考了多个技术文档的最佳实践: from contextlib ...