【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】割点模板的更多相关文章
- Tarjan求割点 || Luogu P3388 【模板】割点(割顶)
题面:P3388 [模板]割点(割顶) 题解:无 代码: #include<cstdio> #include<iostream> #include<cstring> ...
- Luogu P3388 【模板】割点(割顶)
一道求割点的板子题.还是采用经典的Tarjan算法. 首先大致和Tarjan求强连通分量相似,都是用\(dfn_x\)表示访问到\(x\)的时间(时间戳),\(low_x\)表示通过\(x\)回边能走 ...
- 【luogu P3388 割点(割顶)】 模板
题目链接:https://www.luogu.org/problemnew/show/P3388 #include <cstdio> #include <cstring> #i ...
- P3388 【模板】割点(割顶)
P3388 [模板]割点(割顶) 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式 ...
- P3388 【模板】割点(割顶) 题解 (Tarjan)
题目链接 P3388 [模板]割点(割顶) 解题思路 最近学的东西太杂了,多写点博客免得自己糊里糊涂的过去了. 这个题求割点,感觉这篇文章写得挺好. 割点是啥?如果去掉这个点之后连通图变成多个不连通图 ...
- HDU4738 tarjan割边|割边、割点模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4738 坑点: 处理重边 图可能不连通,要输出0 若求出的结果是0,则要输出1,因为最少要派一个人 #inc ...
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- Luogu 3371【模板】单源最短路径
Luogu 3371[模板]单源最短路径 第一次写博客用图论题来试一试 接下来是正文部分 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包 ...
随机推荐
- rem辅助式响应布局
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【Spring Boot】java.lang.NoSuchMethodError: org.springframework.web.util.UrlPathHelper.getLookupPathForRequest(Ljavax/servlet/http/HttpServletRequest;Ljava/lang/String;)Ljava/lang/String;
Digest:今天Spring Boot 应用启动成功,访问接口出现如下错误,不知到导致问题关键所在,记录一下这个问题. 浏览器报500错误 项目代码如下 Controller.java packag ...
- Java基础系列二:Java泛型
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...
- html获得当前日期
<html> <head> <title> </title> </head> <body> <!-- 获得当前日期(年月日 ...
- Feeling after reading《Jane Eyre》
Yesterday I read and listened over the book named <Jane Eyre>, the book is very thoughtful, th ...
- 学习笔记11全局处理程序global.asax
*全局处理程序Clobal.asax只能叫这个名字,不能修改文件名,如果网站没有的话,可以自己添加. *Application[]类似于session,是全局的,Application["k ...
- 【IOS开发学习—OC篇】
一.instancetype和id关键字的区别 1)instancetype表示方法的返回类型和调用方法的对象类型相同. 2)在Object-C引入instancetype之前,初始化方法的返回类型都 ...
- 机器学习之scikit-learn库
前面讲到了,这个库适合学习,轻量级,所以先学它. 安装就不讲了,简单.不过得先安装numpy和pandas库才能安装scikit-learn库. 如果安装了anaconda得话,会自带有这个库. -- ...
- 期末考试(正解:三分单峰函数 me~)
好久没有水过杂题了! 今天lsc终于刚过了三道考试题来水杂题了! 期末考试 首先一看还是一脸mb(这是正常现象,毕竟我不像一些大神可以一眼出正解)然后我就被颓了标签,知道是三分单峰函数,但是自己实在是 ...
- python入门之五种字典创建方法
a = dict(one = 1, tow = 2, three = 3)b = {'one' :1,'tow' :2 , 'three' :3}c = dict (zip(['one', 'tow' ...