算法随笔:图论问题之割点割边

割点

定义

割点的定义:如果一个点被删除之后会导致整个图不再是一个连通图,那么这个顶点就是这个图的割点。举例:

 上图中的点2就是一个割点,如果它被删除,则整个图被分为两个连通分量,不再是一个连通图。

求割点的方法

最直观容易想到的一种简单朴素的方法:

依次删除每一个顶点,然后用dfs或者bfs来检查图是否依然连通。如果删除某个顶点后,导致图不再连通,那么刚才删除的顶点就是割点。

这种方法的时间复杂度是O(N(N+M))。显然不是一个高性能的算法。

考虑更高性能的算法:

考虑从根节点开始进行DFS遍历,遍历的同时记录每个节点的遍历顺序(又称为时间戳)到数组num。如下图:

圆圈中数字是顶点编号, 圆圈右上角的数表示这个顶点的“时间戳” 。

那么在遍历过程中如何判断割点?见下表:

节点类型判断方法解释
根节点

对于根节点,有两棵及以上不相连的子树,则根节点是割点

很显然如果根节点有两棵及以上的不相连的子树,那么根节点被删除之后整个图将会不再是一个连通图,会被划分为多个连通块。
非根节点对于非根节点,u的直接子v或者v的后代没有回退到u的祖先的边(没有不经过u直接回到u的祖先的路径),则u不是割点,否则是。如果非根节点u的子节点v及v的后代节点有路径可以不经过点u回退到u的祖先,那么这个点即使被删除,整个图依然是连通的。

那么该算法具体如何实现呢?

定义一个数组low来记录每个顶点在不经过父顶点时,能够回到的最小“时间戳”。

对于某个顶点u,如果存在至少一个顶点v(u的儿子),使得low[v]>=num[u],即不能退回到祖先,顶多退回到顶点u,那么u点为割点。

示例代码(POJ1144)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e2 + 10;
const int INF = 0x3fffffff;
const int mod = 1000000007;
int num[maxn];      // 记录每个点的dfs遍历顺序
int low[maxn];      // low[v]记录v和v的后代能连回到的祖先的num
int dfn;            // 记录进入递归的顺序(也称为时间戳)
bool isCut[maxn];   // 标记割点
vector<int> G[maxn];void dfs(int u, int fa) {       // 当前节点u,u的父节点falow[u] = num[u] = ++dfn;    // 记录该点的遍历顺序,该点的low值初始等于numint child = 0;              // 子树数目for (int i = 0; i < G[u].size(); i++) {     // 处理u的所有子节点int v = G[u][i];if (!num[v]) {  // v没访问过child++;dfs(v, u);low[u] = min(low[u], low[v]);       // 用后代的返回值更新low值,从v以及v的后代可以回退到的祖先的num值if (low[v] >= num[u] && u != 1) {   // 对于非根节点,u的直接子v或者v的后代没有回退到u的祖先的边,则u是割点isCut[u] = true;}} else if (num[v] < num[u] && v != fa) {    // 处理回退边low[u] = min(low[u], num[v]);}}if (u == 1 && child >= 2) {     // 对于根节点,有两棵以上不相连的子树,则根节点是割点isCut[1] = true;}
}void solve() {int n, ans;while (cin >> n, n) {if (n == 0)break;memset(low, 0, sizeof low);memset(num, 0, sizeof num);dfn = 0;for (int i = 1; i <= n; i++) {G[i].clear();}int a, b;while (cin >> a, a) {while (cin.get() != '\n') {cin >> b;G[a].push_back(b);G[b].push_back(a);}}memset(isCut, 0, sizeof isCut);ans = 0;dfs(1, 1);for (int i = 1; i <= n; i++) {ans += isCut[i];}cout << ans << endl;}
}int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout << fixed;cout.precision(18);solve();return 0;
}

割边

定义

如果在一个无向图中删除某条边后,图不再连通,那么这条边叫做割边(又称桥)。举例:

求割边的方法

只需将求割点的算法修改一个符号就可以。 只需将low[v]>=num[u]改为low[v]>num[u]。

这是为什么呢?

low[v]和num[u]相等则表示还可以回到父亲结点; 而low[v]>num[u]则表示连父亲都回不到了。倘若顶点v不能回到祖先,也没有另外的路能回到父亲,那么 u-v 这条边就是割边。

割边代码

……后边补上……

注:本文的部分内容和图片参考了 https://www.cnblogs.com/ljy-endl/p/11595161.html

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

华为固件解包工具linux,华为官方APP固件解包工具

官方ROM解包教程&#xff0c;现写一个简易的教程&#xff0c;不需要linux环境&#xff0c;直接在window XP/ win7上操作&#xff0c;WIN8亲自测 首选需要用到两个工具. APP固件解包工具---解压华为ROM的APP文件 ext4_unpacker--- IMG文件解压工具&#xff01; 教程&#xff1a;…

华为固件解包工具linux,华为app固件解包工具

华为固件解包工具是一款针对华为手机所推出的APP固件解包软件。它的功能十分强大&#xff0c;将华为官方SD卡刷机包UPDATA.APP解包成IMG镜像分区文件&#xff0c;还可以提取recovery.img、system.img等分区文件&#xff0c;操作十分简单&#xff0c;需要的用户可下载体验。 【使…

华为悦盒Q21和EC6109U-Hi3798MV200-已ROOT和ADB当贝桌面TTL线刷烧录固件包

华为悦盒Q21和EC6109U-Hi3798MV200-已ROOT和ADB当贝桌面TTL线刷烧录固件包 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的…

华为固件解包工具linux,华为EMUI8.0固件解包教程(含提取recovery方法)

华为EMUI8.0固件解包教程(含提取recovery方法),现在出来的新款华为手机基本上都是EMUI8.0系统的&#xff0c;一些玩机新手便想着怎么提取一下固件中的相关文件&#xff0c;比如原版的recovery.img或者system.img文件&#xff0c;懂得linux的用户还能从中提取出一些自己需要的文…

华为手机如何删除云存储中的数据

--------------------------------------------- -- 时间&#xff1a;2019-01-29 -- 创建人&#xff1a;Ruo_Xiao -- 邮箱&#xff1a;xclsoftware163.com --------------------------------------------- 1、网址&#xff1a;https://www.hicloud.com/home#/home 2、登陆之后…

华为畅享10计算机卸载了怎么恢复,华为自带软件被删除如何恢复

关于华为手机自带软件如果被删除了&#xff0c;我们该怎么去恢复呢&#xff0c;相信有不少的小伙伴都不清楚&#xff0c;接下来就跟着IEfans小编一起了解一下华为自带软件恢复方法图文教程吧&#xff01; 方法/步骤分享&#xff1a; 1、首先我们需要打开华为手机基础设置&#…

H3C设备删除固件文件、清空回收站

使用H3C网络设备时&#xff0c;可能会碰到固件升级&#xff0c;有时升级文件过大&#xff0c;可能需要删除H3C设备上的不必要的文件来释放flash空间&#xff0c;用delete文件名删除文件后可用空间并没变大&#xff0c;是文件名虽然dir看不到了&#xff0c;实际空间并没释放。下…

华为系统更新彻底卸载_华为手机系统更新好吗 华为手机系统更新方法

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。 …

教学网站毕业设计源码【演示视频】

演示视频 教学网站毕业设计源码【演示视频】 – 源社区演示视频 源码下载地址 https://www.51aspx.com/code/OYXOnlineTeachingWebsite 源码特点 一款在线教学网站毕业设计&#xff0c;包含论文&#xff0c;有后台管理&#xff0c;适合初学者学…https://club.51aspx.com/2544…

如何高效录制教学视频?

从前那些无法绕开的繁琐操作&#xff0c;现在都可以由优秀的软件工具帮你搞定了。 题图&#xff1a;Photo by Johanna Buguet on Unsplash 最近我做了一系列的教学视频。留言区除了对视频内容的询问外&#xff0c;也有不少小伙伴问我&#xff0c;用了什么工具。 其实录视频这…

网易最新视频剪辑课程来了

网易剪辑师养成计划 - 0基础 0费用 纯干货- 大家看过我以前推文的话&#xff0c;会知道这两年&#xff0c;我更多地开始尝试拍短视频了。 没有特别的起因&#xff0c;就是出去玩想记录下&#xff0c;从开先的手机拍摄和剪辑&#xff0c;到后来想把视频做地更好些&#xff0c;就…

短视频剪辑制作教学:编辑短视频时需要注意的三个方面

短视频剪辑制作教学&#xff1a;编辑短视频时需要注意的三个方面 今天为大家带来的是短视频剪辑制作教学之编辑短视频时需要注意到的三个方面&#xff0c;注意到并做好&#xff0c;才能做出来更加优质的短视频内容&#xff0c;那么话不多说&#xff0c;接下来就一起看看吧&…

allure测试报告

使用pytest结合Allure进行测试报告生成的简单教程 allure测试报告 Allure基于Java开发&#xff0c;因此我们需要提前安装Java 8或以上版本的环境。 ◆安装allure-pytest插件在DOS窗口输入命令“pip3 install allure-pytest”&#xff0c;然后按“Enter”键。 下载安装Allure…

fork--创建进程

fork–创建进程 fork函数基本知识 pid_t fork(void) 返回值&#xff1a;在父进程中&#xff0c;成功的话返回子进程的pid&#xff0c;失败返回-1在子进程中&#xff0c;返回值pid为0fork()函数将运行着的进程分裂出另一个子进程&#xff0c;它通过拷贝父进程的方式创建子进程…

[SAMtools] 常用指令总结

源自&#xff1a;http://sanwen.net/a/hirxmpo.html samtools是一系列处理bam和sam格式文件的应用程序集合&#xff0c;具有众多的功能。 首先呢&#xff0c;bam和sam文件主要是bwa、bowtie、tophat等序列比对工具产生的&#xff0c;这些软件我们后面会谈到。 软件下载安装&…

Glide 的超时控制相关处理

作者&#xff1a;newki 前言 Glide 相信大家都不陌生&#xff0c;各种源码分析&#xff0c;使用介绍大家应该都是烂熟于心。但是设置 Glide 的超时问题大家遇到过没有。 我遇到了&#xff0c;并且掉坑里了&#xff0c;情况是这样的。 调用接口从网络拉取用户头像&#xff0c…

高通量DNA测序数据的生物信息学方法

来源&#xff1a;大数据期刊 时间&#xff1a;2016-05-13 14:41:09 作者&#xff1a;詹晓娟 姚登举 朱怀球 詹晓娟1&#xff0c;姚登举2&#xff0c;朱怀球3 1. 黑龙江工程学院计算机科学与技术学院&#xff0c;黑龙江 哈尔滨 150050&#xff1b; 2. 哈尔滨理工大学软件学院…

C++ pair详解

pair pair在cplusplus 与CPrimer中的介绍 首先可以看到pair是一个class template —类模板 pair也是一种模板类型。 对 pair 的介绍是&#xff1a; 这个类将一对值耦合在一起&#xff0c;这些值可能是不同类型的(T1和T2)。单个值可以通过其公共成员first和second访问。 pair是…

聊聊OpenStack运维架构

前言 想一想&#xff0c;从事OpenStack杂七杂八的事儿&#xff0c;至今正好三年半了。做过QA测试&#xff08;手动的、自动的&#xff09;、CI&#xff08;gerrit、jenkins、gitlab、harbor&#xff09;、云产品封装&#xff08;从系统pxe到openstack代码&#xff09;、自动化…

Lua pairs与ipairs效率分析

介于大家目前有些人比较关心 lua table中pairs 和 ipairs的效率问题, 特此研究了一下... 如有不正 还需指出.. 首先来看下 lua中table的结构定义: table中分为2个存储空间, 一个是线性数组空间(TValue *array), 和一个hash空间(Node *node) 当我们使用 pairs 和 ipairs 会产生…