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. (七)javac编译

    文章目录 1.基本格式 2.目标路径 2.1 缺省项 2.2 指定路径 2.2.1 全路径 2.2.2 相对路径 3.源文件 3.1 无第三方库 3.1.1 基本方法 3.1.2 添加目录 3.1.3 ...

  2. SOLID原则、设计模式适用于Python语言吗

    在阅读 clean architecture的过程中,会发现作者经常提到recompile redeploy,这些术语看起来都跟静态类型语言有关,比如Java.C++.C#.而在我经常使用的pytho ...

  3. oracle 特殊符号替换删除处理

    1 获取ascii码 select ascii('特殊字符') from dual 2 替换 update table set testfield= replace(testfield,chr(asc ...

  4. 前端技术之:webpack热模块替换(HMR)

    第一步:安装HMR中间件: npm install --save-dev webpack-hot-middleware   第二步:webpack配置中引入webpack对象     const we ...

  5. Codeforces 游记

    早就对这个比赛平台有所耳闻(事实上,之前打过一场div2惨的一批……)今天去打了一场div3. 首先还是吐槽一下这个毛子时区的比赛时间,从十点三十五到零点三十五……这种时间要不是在家根本没法打嘛…… ...

  6. 《Effective Java》 读书笔记(五)使用依赖注入取代原本的资源依赖

    相信接触过Spring的同学,对于依赖注入并不陌生. 刚开始在听说这个名字的时候,一直不明白到底什么叫依赖注入,后来才发现,依赖注入一直都存在我们日常代码中,只是我们没有刻意的把它提出来,然后再取这样 ...

  7. 学习笔记37_MVC模板页

    ASPX母版页: 1.添加一个母版页,位置../Views/Shared,有 <asp:ContentPlaceHolder ID = "ContentPlaceHolder1&quo ...

  8. [考试反思]1105csp-s模拟测试102: 贪婪

    还是有点蠢... 多测没清空T3挂40...(只得了人口普查分20) 多测题要把样例复制粘两遍自测一下防止未清空出锅. 然而不算分... 其实到现在了算不算也不重要了吧... 而且其实T3只考虑最长路 ...

  9. 一份自用的webpack配置文件及其配置说明

    1.webpack.config.js const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plu ...

  10. Project Euler 51: Prime digit replacements

    通过替换*3这样一个两位数的第一位,我们可以发现形成的九个数字有六个是质数,即13, 23,43,53,73,83.类似的,如果我们用同样的数字替换56**3这样一个五位数的第三位和第四位,会生成56 ...