Luogu P3388

在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合。

如果某个割点集合只含有一个顶点X(也即{X}是一个割点集合),那么X称为一个割点。

为了便于理解,我们可以从狭义上进行分析:对于一个连通无向图,删去其中的一个点可以令这个图不再连通,那么这个点就是割点(之一)。

那么再推广一下:对于一个无向图,删除其中一个点,使这个图的连通块增多,那么这个点就是割点之一。

对于这一类题目,仍然可以采用类似求强连通分量时使用的Tarjan算法进行求解。

【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)

如果没有学习过相关知识,可以看这一篇博客。

做法如下:

先考虑对于当前搜索树的根节点,很容易想到如果它有多棵子树(其实这么说不太对,可以说是根节点有多个直接子节点),那么这个根节点肯定就会是一个割点。

那么对于非根节点呢?像是求强连通分量时的做法一样,寻找返祖边。用low数组记录每个点能返回的最早访问的节点。

想象下面这样一种情况:如果low[v]>=dfn[u],说明v节点及其以下的任何一个节点都不可能不经过u节点访问到u节点以前的节点,在这样的情况下,u节点就成为了一个割点。

还有一个通常争议较大的地方,比较难以理解:

假设当前节点走到了一条往回走的边

low[now]=min(low[now],dfn[v]);//now即上文提到的u

在更新low的时候,这一句不能够写成下面的形式

low[now]=min(low[now],low[v]);

原因如下:我们知道low[v]记录是v能通过非树边(通常是返祖边,横叉边有的时候也是可以的)访问到的最早的节点,那么low[v]记录的节点必然在v之前或刚好为v。假设这样一种情况,low[v]记录的节点在v之前,那么按照第二种更新方法,low[now]被更新成v以前的节点。当我们回溯到节点v进行判断时,我们不会将v节点判定为割点,因为他的子节点now能访问到v以前的节点,不符合low[v]>=dfn[u]的条件。事实上,这种情况下,v也是一个割点。

可以自行画图进行理解

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=2*1e4+15,maxm=1e5+10;
struct data
{
int to,nxt;
}e[2*maxm];
int dfn[maxn],low[maxn],tim,head[maxn],n,m,x,y,ans;
bool cut[maxn];
void tarjan(int now,int root)
{
int bt=0;
dfn[now]=low[now]=++tim;
for (int i=head[now];i;i=e[i].nxt)
{
int v=e[i].to;
if (!dfn[v])
{
tarjan(v,root);
low[now]=min(low[now],low[v]);
if (low[v]>=dfn[now]&&now!=root) cut[now]=true;
if (now==root) bt++;
}
low[now]=min(low[now],dfn[v]);
}
if (now==root&&bt>1) cut[root]=true;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
e[i].to=y;e[i+m].to=x;
e[i].nxt=head[x];e[i+m].nxt=head[y];
head[x]=i;head[y]=i+m;
}
for (int i=1;i<=n;i++) if (!dfn[i]) tarjan(i,i);
for (int i=1;i<=n;i++) if (cut[i]) ans++;
printf("%d\n",ans);
for (int i=1;i<=n;i++) if (cut[i]) printf("%d ",i);
return 0;
}

【Luogu P3388】割点模板的更多相关文章

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

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

  2. Luogu P3388 【模板】割点(割顶)

    一道求割点的板子题.还是采用经典的Tarjan算法. 首先大致和Tarjan求强连通分量相似,都是用\(dfn_x\)表示访问到\(x\)的时间(时间戳),\(low_x\)表示通过\(x\)回边能走 ...

  3. 【luogu P3388 割点(割顶)】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3388 #include <cstdio> #include <cstring> #i ...

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

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

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

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

  6. HDU4738 tarjan割边|割边、割点模板

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4738 坑点: 处理重边 图可能不连通,要输出0 若求出的结果是0,则要输出1,因为最少要派一个人 #inc ...

  7. Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)

    Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...

  8. Luogu 3375 【模板】KMP字符串匹配(KMP算法)

    Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...

  9. Luogu 3371【模板】单源最短路径

    Luogu 3371[模板]单源最短路径 第一次写博客用图论题来试一试 接下来是正文部分 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包 ...

随机推荐

  1. unity射线检测

    unity中射线检测时非常实用也经常实用的一种手段.下面讲解一下射线检测问题. 1)Ray 根据射线端点和射线的方向定义一条射线 Ray ray= new Ray(transform.position ...

  2. (一)django创建

    1.打开终端,安装django:输入pip install django 2.创建django项目:django-admin startproject myweb 3.启动项目:进入到myweb,输入 ...

  3. web.xml 配置文件 超详细说明!!!

    一.web.xml是什么? 首先 web.xml 是java web 项目的一个重要的配置文件,但是web.xml文件并不是Java web工程必须的. web.xml文件是用来配置:欢迎页.serv ...

  4. mock和axios常见的传参方式

    第一次接手项目,传参方式还有些吃力,因此做一下总结. 首先我们需要会看swagger中的接口.里面写了某个接口需要接收什么样的值,前端怎么传递这个值 在mock中的传参方式: mock中传参的方式有两 ...

  5. emacs考场短配置

    (set-background-color "gray15") (set-foreground-color "gray") ;;设置颜色 (global-set ...

  6. Go 基础学习笔记 (5)| 数据类型说明与使用

    在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...

  7. acm经验(转)

    先简单介绍一下自己: 高中在OI打过一段时间酱油,大一后暑假进入ACM集训队,到大三寒假,总共一年半的ACM生涯. 总共参加了四场比赛:区域赛一银(2013长春)一铜(2013杭州)一铁(2012金华 ...

  8. 利用Python获取统计自己的qq群成员信息

    利用python获取自己的qq群成员信息! 首先说明一下需要使用的工具以及技术:python3 + selenium selenium安装方法:pip install selenium 前提:获取自己 ...

  9. C#同级catch块和finally块中全都抛出异常,上一级捕获哪一个?

    C#同级catch块和finally块中全都抛出异常,上一级优先捕获finally块中的异常. 测试代码: using System; namespace test { class Program { ...

  10. GitHub 发布了官方 App,还打算冰封你的代码一千年

    11 月 13 日,GitHub Universe 2019 开发者大会上,公布了大量新功能,包括发布 GitHub 移动版.GitHub Actions 和 Packages 正式版上市.重新设计了 ...