【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[模板]单源最短路径 第一次写博客用图论题来试一试 接下来是正文部分 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包 ...
随机推荐
- C#开发命令执行驱动程序 之 控制标志的命令行参数
/// <summary> /// 在cmd窗体内执行如下: /// CtrlOrderDrierApp.exe -f -t /// 返回: /// FOO /// Show Table ...
- Java 给Word指定字符串添加批注
本文将介绍在Java程序中如何给Word文档中的指定字符串添加批注.前文中,主要介绍的是针对某个段落来添加批注,以及回复.编辑.删除批注的方法,如果需要针对特定关键词或指定字符串来设置批注,可以参考本 ...
- Android_Fragment
(一) Faragment有自己的生命周期 Fragment依赖于Activity Fragmen通过getActivity()可以获取所在Activity:Activity通过FragmentMan ...
- 为什么 Flutter 是跨平台开发的终极之选
跨平台开发是当下最受欢迎.应用最广泛的框架之一.能实现跨平台开发的框架也五花八门,让人眼花缭乱.最流行的跨平台框架有 Xamarin.PhoneGap.Ionic.Titanium.Monaca.Se ...
- Unity1-HellowWord
1.新建一个Unity工程,选择3D类型项目. 2.目录下有: Assets是主要操作的目录. 3.面板 4.做一个简单的方块移动效果: 1.在Hierarchy面板中,点击Create-3D Obj ...
- CSPS模拟 83
紧张起来,集训已过半! 稍微有点惆怅.. T1 什么玩意,神仙树形dp? 没思路,先去T2. (遇到难题就绕过去是真的爽啊) T2 $n^2$暴力很好打 组合数是不是有规律? 找一下规律,发现十分眼熟 ...
- JAVA内存溢出与内存泄露
虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出的风险. 最近在网上搜集了一些资料,现整理如下: —————————————————————————————————————— ...
- Mybaits 源码解析 (十二)----- Mybatis的事务如何被Spring管理?Mybatis和Spring事务中用的Connection是同一个吗?
不知道一些同学有没有这种疑问,为什么Mybtis中要配置dataSource,Spring的事务中也要配置dataSource?那么Mybatis和Spring事务中用的Connection是同一个吗 ...
- javascript中判断数据类型
编写javascript代码的时候常常要判断变量,字面量的类型,可以用typeof,instanceof,Array.isArray(),等方法,究竟哪一种最方便,最实用,最省心呢?本问探讨这个问题. ...
- css3 svg路径蒙版动画
css3 svg路径蒙版动画 具体看https://www.cnblogs.com/oubenruing/p/9568954.html 还有个更好控制的写法<pre><!DOCTYP ...