博客园同步

原题链接

简要题意:

给定一个图,求所有割点。

割点(割顶)的定义:去掉该点整个图不连通。

前置知识:

强连通分量的 Tarjan \texttt{Tarjan} Tarjan 求法。

不懂的可以先去了解下

本题作为 Tarjan \texttt{Tarjan} Tarjan 求割点的模板题。

首先,我们同样和求强连通分量一样,搞出一个 dfn \text{dfn} dfn 和 low \text{low} low.

接着,你会发现这样的情况:

如果 x x x 节点后面搜索树上的点 y y y 都满足 l o w y ≥ x low_y \geq x lowy​≥x,此时 x x x 不出意外 是一个割点。

那 “意外” 指什么?

想一下,如果是一条链的链顶,同样也满足 l o w y ≥ x ( y ∈ Subtree(x) ) low_y \geq x(y \in \texttt{Subtree(x)}) lowy​≥x(y∈Subtree(x)),但它不是割点。

因此,我们从 p p p 节点开始搜索,就要判断清楚, p p p 到底是不是?

应该是这样的:如果 p p p 有超过 1 1 1 个儿子,说明把它弄掉之后那 > 1 >1 >1 个儿子走不通,所以 p p p 是割点。

否则 ≤ 1 \leq 1 ≤1 个儿子显然不是割点,这是要特殊判断的。

答案如何记录?你注意到需要将答案去重,排序(因为一个点可能被它的每一个子树重复的记录多次)。那么显然就是用 set \texttt{set} set 解决!

智商不够,数据结构来凑

set \texttt{set} set 的到来凭空给时间增加一个 log \texttt{log} log,但是没有关系,因为本来 Tarjan \texttt{Tarjan} Tarjan 就是线性的。

(其实明明可以先哈希的,可是用 STL \text{STL} STL 多快乐啊·)

注意细节即可通过。

时间复杂度: O ( n log ⁡ n + m ) O(n \log n + m) O(nlogn+m).

实际得分: 100 p t s 100pts 100pts.

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;const int N=1e5+1;inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}int low[N],dfn[N],fa[N],n,m,cnt=0;
bool vis[N]; set<int>s;
vector<int>G[N];inline void Tarjan(int u) {int sum=0; vis[u]=1; //sum 是子树个数dfn[u]=low[u]=++cnt;for(int i=0;i<G[u].size();i++) {int v=G[u][i];if(!vis[v]) {fa[v]=u; sum++; Tarjan(v); //父亲节点用来判断起始点low[u]=min(low[u],low[v]);if(fa[u]!=u && low[v]>=dfn[u]) s.insert(u); //先把起始点排除} else if(v!=fa[u]) low[u]=min(low[u],dfn[v]); //同样记录} if(fa[u]==u && sum>=2) s.insert(u); //最后判断起始点
}int main(){n=read(),m=read(); while(m--) {int x=read(),y=read();G[x].push_back(y);G[y].push_back(x);} for(int i=1;i<=n;i++)if(!vis[i]) {fa[i]=i; //表示从 i 节点开始搜索Tarjan(i);cnt=0;}cout<<s.size()<<endl;for(set<int>::iterator i=s.begin();i!=s.end();i++)printf("%d ",*i); //记得是空格隔开,不是答案换行return 0;
}

P3388 【模板】割点(割顶) 题解相关推荐

  1. 洛谷 P3388 【模板】割点(割顶) 根+非根+dfn[]+low[]+不一样的Tarjan算法

    洛谷  P3388 [模板]割点(割顶)  根+非根+dfn[]+low[]+不一样的Tarjan算法 Tarjan算法,详见https://blog.csdn.net/mrcrack/article ...

  2. UVA 315 :Network (无向图求割顶)

    题目链接 题意:求所给无向图中一共有多少个割顶 用的lrj训练指南P314的模板 #include<bits/stdc++.h> using namespace std; typedef ...

  3. 无向图的割顶、桥、BCC和eBCC相关

    几个例题代码待填 割顶:若去掉一个点和与这个点相连的边后,图不再连通,则这个点是割顶. ​ 求法:若节点\(u\)存在一棵子树\(v\)满足\(v\)中所有节点的回边都指向\(u\)及以下的节点(即\ ...

  4. 【BZOJ1123】[POI2008]BLO【割顶】

    [题目链接] 题意可见discuss. 用Tarjan求割顶,然后对割顶的所有子树求点对个数(前缀和扫一遍),最后把自身和其他点的答案加上. 没注意边,数组开小了. /* Pigonometry */ ...

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

    /*表示割点模板很难理解.... 但是呢,可以将整个图用深搜来一步步递归.. dfn[x]<=low[tmp] && x!=mr的点就++: 完毕.... PS:小心第一个节点. ...

  6. 【模板】割点(割顶)

    题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...

  7. 【模板】 割点(割顶)

    神马网站的链接都可以啊~~~~ 模板题,无程序说明 Code: #include<bits/stdc++.h> #define rep(i,j,k) for(int i=j;i<=k ...

  8. P3388-[模板]割点(割顶)【tarjan】

    正题 题目大意 求所有割点 解题思路 跑tarjantarjantarjan,然后判断dfnx≤lowydfn_x\leq low_ydfnx​≤lowy​ codecodecode #include ...

  9. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

最新文章

  1. TCP/IP基础概念及通信过程举例
  2. python哨兵循环_Python通用循环的构造方法实例分析
  3. linux的read命令
  4. DPI — 深度数据报文解析
  5. ubuntu 14.04 no valid active connections found
  6. 双系统win7+ubuntu18.10在win7中读取linux下面的内容
  7. Sql Server2005对t-sql的增强之Cross Apply
  8. matlab中数值的取整、四舍五入、文本输出
  9. matlab频谱分析_罗德与施瓦茨两款新的信号和频谱分析仪 具有多种频率型号
  10. c#中将整数转化为字符串_在C#中将字符串转换为字节数组
  11. 使用Metal打造令人惊叹的游戏效果
  12. SpeedTree学习笔记(转)
  13. 计算机基础进制转换(二进制、八进制、十进制、十六进制)
  14. C语言 之 if 语句
  15. XV6 RISCV 源码阅读报告之 进程调度
  16. 1 小时 47 分钟破 1000 亿, 双 11 十周年,你剁手了多少钱?
  17. 一个即将30岁Android程序员的自诉,在内卷的大环境之下迷惘的大龄程序员该如何破局?
  18. 深度linux qq下载,Deepin内置的软件商店里收录QQ for Linux版,方便用户安装
  19. 数据工程学建设思考与实践
  20. linux删除gnome桌面,桌面应用|去掉了 chrome-gnome-shell 的 Gnome

热门文章

  1. 很少讲这么详细,新手做百家号,简单4步教会你如何注册账号
  2. 鉴别ChatGPT真伪的最简单方法
  3. AAA服务器搭建与实验案例
  4. 计算机组系统原理—模型机
  5. canvas绘制大转盘
  6. 计算机毕业设计springboot+vue基本微信小程序的乐旋乒乓球课程管理系统 uniapp 小程序
  7. CT成像——等距扇束正反投影的简单介绍以及在matlab上的实现
  8. Fielding 博士论文阅读笔记(一)
  9. opensuse zypper源
  10. ConcurrentHashMap源码解析_01 成员属性、内部类、构造方法分析