一道求割点的板子题。还是采用经典的Tarjan算法。

首先大致和Tarjan求强连通分量相似,都是用\(dfn_x\)表示访问到\(x\)的时间(时间戳),\(low_x\)表示通过\(x\)回边能走到的时间戳最小的点的时间戳。

然后我们考虑一下对于一个点如何判断它是否为割点:

  • 若这个点是我们人为选择的起始节点(根节点),那么当它的子树个数大于等于两个时肯定就是割点(因为这些子树就无法互相到达)
  • 若这个点不是根节点,那么当它的任意一个出点\(y\)的\(low_y>=dfn_x\)时,证明它的儿子无法通过回边回到它前面的点,因此这个点就是割点。

然后注意一下一个经典的细节,在通过回边更新时要写成:

low[now]=min(low[now],dfn[e[i].to]);

而不是

low[now]=min(low[now],low[e[i].to]);

然后引用一下Luogu某大佬taoran的话:

由于此处是一张无向图,我们有双向建了边,导致节点可以回溯到它的父节点;

而如果从它的父节点或其父节点的另一棵子树上有向上很多的返祖边,

这时把子节点的low值赋为父节点的low,就可能导致其low==其父节点low<其父节点dfn,

从而使本该是割点的点被忽视了,答案就少了

然后就当板子题切掉吧。CODE

#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
const int N=100005;
struct edge
{
int to,next;
}e[N<<1];
int head[N],father[N],low[N],dfn[N],cnt,tot,ans,n,m,x,y;
bool cut[N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(int x)
{
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline void add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline void Tarjan(int now)
{
dfn[now]=low[now]=++tot; int res=0;
for (register int i=head[now];i!=-1;i=e[i].next)
if (!dfn[e[i].to])
{
father[e[i].to]=now; ++res;
Tarjan(e[i].to); low[now]=min(low[now],low[e[i].to]);
if (father[now]&&low[e[i].to]>=dfn[now]) !cut[now]&&(cut[now]=1,++ans);
} else if (e[i].to!=father[now]) low[now]=min(low[now],dfn[e[i].to]);
if (!father[now]&&res>=2) !cut[now]&&(cut[now]=1,++ans);
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(n); read(m);
memset(e,-1,sizeof(e)); memset(head,-1,sizeof(head));
for (i=1;i<=m;++i)
read(x),read(y),add(x,y),add(y,x);
for (i=1;i<=n;++i)
if (!dfn[i]) Tarjan(i);
for (write(ans),putchar('\n'),i=1;i<=n;++i)
if (cut[i]) write(i),putchar(' ');
return 0;
}

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

  1. 【Luogu P3388】割点模板

    Luogu P3388 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合. 如果某个割点集合只含有一个顶点X(也即{X ...

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

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

  3. $割点割顶tarjan$

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

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

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

  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)

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

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

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

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

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

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

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

随机推荐

  1. Java并发编程(五)Lock

    一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 在上面一篇文章中,我们了解到如果一个代码块被syn ...

  2. (网页)JQuery 对 Select option 的操作(转)

    转自博客园: <select id="selectID" > <option value="1">1</option> &l ...

  3. .net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)

    Pvalue 计算 项目设计pvalue计算,但是由于.net 没有类似的公式或者函数,最终决定使用.net 调用R语言 采用.net 调用r语言的公用函数 需要安装 r语言环境 https://mi ...

  4. s面向对象的写法

    js面向对象的写法 一.在html中引入该js文件,使用时: <script> var BuyBw8Product = new buyBw8Product(); </script&g ...

  5. Web的攻击技术笔记

    HTTP不具备必要的安全功能,就是一个通用的单纯协议机制,比如远程登录时会用到的SSH协议来说,SSH具备协议级别的认证及回话管理等功能,HTTP协议则没有.另外在架设SSH服务方面,任何人都可以轻易 ...

  6. 【数据结构】约瑟夫问题 C语言链表实现

    1.首先,我们先来了解一下什么是约瑟夫环问题: 讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投 ...

  7. 【Beta阶段】测试报告

    兼容性测试   功能 描述 效果 Chrome浏览器 FireFox浏览器 IE浏览器 搜狗浏览器 主页实用小工具按钮 跳转到实用小工具首页 跳转到实用小工具首页 ü ü ü ü 鼠标移动到逐差法计算 ...

  8. <20190106>千兆 小型局域网传输速率不达标问题解决

    故障描述: 三层交换机下挂了 个一层交换机, 全部交换终端包括路由器传输界面意确认全是千兆设备, 其中NAS端到 主机1 的传输速度只有100Mb, 观察主机1 的网络配置,确实连接速度是 100Mb ...

  9. WINDOWS 下设置单独的java环境

    set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_65set PATH=%JAVA_HOME%\bin;%PATH%;D:cd D:\JavaProjectcm ...

  10. 关于解决Python中requests模块在PyCharm工具中导入问题

    问题引入: 今天在学习Python网络请求的时候,导入requests模块时一直报红色波浪线,如图: 反复折腾,一直以为自己没有安装requests模块,反复安装反复卸载: 安装方法: 首先 cd 进 ...