Tarjan 之 割点 学习笔记

news/2024/11/13 9:32:21/文章来源:https://www.cnblogs.com/sea-and-sky/p/18373812

首先,要求割点,我们需要知道割点是什么

割点: 是指在无向连通图中,如果删除某个顶点后,图的连通分量增加,则称该顶点为割点

好,知道了这个,那我们怎么去求他呢?

Tarjan 大神给出了一种依然基于时间戳的算法

图片来源:董晓算法

image

image

割点的求法大概就是这样的
所以细节还是见代码吧

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node
{vector<int > to;int dfn;int low;bool cut;
};
node nodes[100000];
int tot;
int root;void tarjan(int x)
{nodes[x].dfn=nodes[x].low=++tot;//标记DFN值int chi=0;//子节点int to;for(int ww=0;ww<nodes[x].to.size();ww++){to=nodes[x].to[ww];if(nodes[to].dfn==0)//如果这个儿子节点还没被访问过{tarjan(to);//递归的跑Tarjannodes[x].low=min(nodes[x].low,nodes[to].low);//更新本节点的low值if(nodes[to].low>=nodes[x].dfn)//如果子节点的low值比本节点的DFN大{chi++;if(x!=root||chi>1){nodes[x].cut=1;//是割点}}}else//如果没被访问过{nodes[x].low=min(nodes[x].low,nodes[to].dfn);//更新low值}}
}
int main()
{ios::sync_with_stdio(false);cin>>n>>m;int a,b;for(int yy=1;yy<=m;yy++){cin>>a>>b;nodes[a].to.push_back(b);nodes[b].to.push_back(a);}for(root=1;root<=n;root++){if(!nodes[root].dfn){tarjan(root);}}int ans=0;for(int ww=1;ww<=n;ww++){ans+=nodes[ww].cut;}cout<<ans<<endl;for(int ww=1;ww<=n;ww++){if(nodes[ww].cut){cout<<ww<<" ";}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/785403.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

暑假集训CSP提高模拟27

暑假集训CSP提高模拟27 组题人: @KafuuChinocpp \(T1\) P236.线性只因 \(100pts\)诈骗题。部分分正解记 \(opt\) 表示待选集合,统计 \(opt\) 中这一位为 \(1\) 的数并加入临时集合 \(tmp\) 。若 \(tmp\) 大小 \(\ge m\) 则加上这一位的贡献并将 \(opt\) 赋成 \(tmp\) 否则不管…

关于Arrays.asList返回List无法新增和删除?

关于Arrays.asList返回的List无法新增和删除? 这个是在写项目的时候发现的,然后就分析了一下源码,得其内部原理 复现代码示例: public class ArraysAsList {public static void main(String[] args) {Integer[] array = {1, 2, 3, 4, 5};List<Integer> list = Arrays…

小红书分享踩坑和解决

​小红书官方介入链接:小红书分享开放平台 下载sdk文件,位置如下图所示 之后可以按照官方文档进行开发,接入也较简单,这里主要是说明一些隐藏的坑点 一、分享应用内的文件到小红书(这里主要是指应用包名下的文件内容),需要注意setFileProviderAuthority()这个方法。 例…

用GDI+旋转多边形来绘制一个时钟摸拟小程序

效果图 在头文件类中声明变量TCHAR m_dayStr[4];    // 日期TCHAR m_weekStr[4];  // 星期Gdiplus::Font* m_pFont;  // 字体Gdiplus::StringFormat m_strFormat;  // 格式化字符串Gdiplus::Pen* m_pPen;      // 画笔Gdiplus::SolidBrush* m_pBrush;  // 画…

CREO装配约束

creo装配约束第一个是从添加进去的时候, 当直接从装配体中重新约束元件,需要点击左侧层树,右键点击编辑定义编辑定义右侧的链条符号也可以查看约束了那些内容

【流量特征+webshell】 菜刀 一句话流量分析

连接webshell 准备一句话 <?php eval($_POST[caidao]);?>打开菜刀连接webshell使用wireshark查询流量 特征分析 特征一:POST方法,一句话路径 首先,过滤http流量,可以看到有访问webshell后门的路径特征二:UA头均为百度爬虫标识User-Agent: Mozilla/5.0 (compatible…

Linux 中 sed G选项在行后添加空行

001、[root@localhost test]# ls a.txt [root@localhost test]# cat a.txt ## 测试数据 dfghghj hgfdwe [root@localhost test]# sed G a.txt ## G添加空行 dfghghjhgfdwe[root@localhost test]# sed G;G a.txt dfghghjhgfdwe[root@localhost test]# sed G;G;G…

【溯源系列】使用Wireshark分析日志文件:发现有人对网站进行了SQL注入,分析日志找到该IP地址

工具 Wireshark某公司安全工程师在维护网站时发现有人对网站进行了SQL注入,分析日志找到该IP地址。 要点 SQL.log文件主要显示具体的sql语句】access.log文件主要是记录web页面操作数据库的请求解题很简单,直接打开access.log文件,一步到位,检索sql注入的常见关键词select、…

【OS系列】程序是怎么一步步变成机器指令的?

程序是怎么一步步变成机器指令的? 2024年08月22日 12:03 四川 以下文章来源于码农的荒岛求生 ,作者码农的荒岛求生 大家好,今天简单聊聊程序是怎么一步步变成机器指令的。 左边是我们写的代码,右边是CPU执行的机器指令:想让CPU执行代码只需要简单的点击一下这个按钮:可是…

小米电视主页导航栏修改啦

小米电视导航栏可以修改啦,终于不再杂乱无章了。 步骤一:点击我的,拉到最下方,导航管理步骤二:进入导航管理后,按遥控器OK键,就可以移动了。OK 键 按遥控器菜单键,就可以删除或者添加了。菜单键 就是这么简单,赶紧去试试吧版权申明本文由:二萌生活发布,如需转载请注…

安装MySQL报错ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)

今天要在本地装个mysql,发现mysql-5.7.19-winx64版总是报错由于找不到MSVCP120.dll,无法继续执行代码。重新安装程序可能会解决此问题。,去微软官网找到了最新的Visual C++ Redistributable for Visual Studio,下载后发现还是不停地报错。怀疑是系统不兼容,没办法只好安装m…

Centos scp 免密传输文件

mkdir -p ~/.ssh 1、在 A 服务器上,进入.ssh 目录; [root@iZam205rbu8s7yra2fop0nZ ~]# cd ~/.ssh/2、在 A 服务器上面的.ssh 目录下生成密钥; [root@iZam205rbu8s7yra2fop0nZ .ssh]# ssh-keygen -t rsa 生成两个密钥,一个是私钥,一个是公钥;3、在 B 服务器上创建.ssh 文…