连通性专题

【搜索专题】DFS之连通性模型与搜索顺序 内部搜索不用(能)回溯,外部搜索才需要(必须)回溯和恢复现场 A、AcWing 1112. 迷宫 内部搜索的一道dfs模板题,别忘了vis #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N = 110; int a[N]; int n, m; int k; char g[N][N]; int sx, sy, ex, ey; bool vis 阅读详情

前情提要

关于图的数据结构

template<int MaxN,int MaxM>
struct Graphs{
	int Last[MaxN],cntn;
	int To[MaxM],Next[MaxM],cntm;
	Graphs(){
		cntn=cntm=0;
		memset(Last,-1,sizeof(Last));
	}
	inline void Clear(){
		cntn=cntm=0;
		memset(Last,-1,sizeof(Last));
	}
};

template<typename Typename>
inline void Insert(Typename&G,int from,int to){
	G.To[G.cntm]=to;
	G.Next[G.cntm]=G.Last[from];G.Last[from]=G.cntm++;
}

若有特殊情况 , , , 会特殊标明 . . .

注意初始化

无向图连通性

定义

D f n x Dfn_x Dfnx​ 为点 x x x 的时间戳 . . .
L o w x Low_x Lowx​ 为满足以下条件点的 D f n Dfn Dfn 的最小值 . . .

  1. 搜索树中以 x x x 为根的子树中的节点 . . .
  2. 通过 1 1 1 条不在搜索树上的边能够到达上述节点的节点 . . .

无向图的割边

若无向边 ( x , y ) (x,y) (x,y) 是割边 , , , 满足 : : : ( ( ( 其中 y ′ y' y′ 为搜索树中 x x x 的子节点 ) ) )
D f n x < L o w y ′ Dfn_x<Low_{y'} Dfnx​<Lowy′​
根据定义 , , , 说明如果不通过边 ( x , y ) (x,y) (x,y) , , , y ′ y' y′ 不能回到 x x x 之前的节点 , , , 故边 ( x , y ) (x,y) (x,y) 为原图的一条割边 . . .

Graphs<MaxN,MaxM>G;
int Dfn[MaxN],Low[MaxN],tot;
bool Bridge[MaxM];
inline void Tarjan(int from,int last){
	Dfn[from]=Low[from]=++tot;
	for(register int k=G.Last[from];k!=-1;k=G.Next[k]){
		if(!Dfn[G.To[k]]){
			Tarjan(G.To[k],k);
			Low[from]=Min(Low[from],Low[G.To[k]]);
			if(Low[G.To[k]]>Low[from])
				Bridge[k]=Bridge[k^1]=true;
		}
		else if(k!=last^1)
			Low[from]=Min(Low[from],Dfn[G.To[k]]);
	}
}

inline void Work(){
	Insert(G,x,y);
	Insert(G,y,x);
}

第 13 13 13 行的判断语句是为了防止父节点的 L o w Low Low 更新现有节点 , , , 其中 l a s t ⊕ 1 last\oplus1 last⊕1 是因为无向图的两条边编号是相邻的 , , , 编号异或 1 1 1 就是反边的编号 , , , 后面的网络流也会有这种技巧 . . .

无向图的割点

若点 x x x 是割点 , , , 满足 : : : ( ( ( 其中 y ′ y' y′ 为搜索树中 x x x 的子节点 ) ) )
D f n x ≤ L o w y ′ , x ≠ r o o t Dfn_x\leq Low_{y'},x\not=root Dfnx​≤Lowy′​,x​=root
特别的 , , , 若 x x x 为搜索树的根节点 , , , x x x 为割点当且仅当搜索树上存在至少两个子节点 y 1 ′ , y 2 ′ y_1',y_2' y1′​,y2′​ 满足上述条件 . . .

根据定义 , , , D f n x = L o w y ′ Dfn_x=Low_{y'} Dfnx​=Lowy′​ 时 , , , 原图就被割点分成两个部分 , , , y ′ y' y′ 所在的一边与 x x x 有多条边相连 . . .

Graphs<MaxN,MaxM>G;
int Dfn[MaxN],Low[MaxN],tot;
bool Cut[MaxM];
inline void Tarjan(int from,int root){
	Dfn[from]=Low[from]=++tot;
	int flag=0;
	for(register int k=G.Last[k];k!=-1;k=G.Next[k]){
		if(!Dfn[G.To[k]]){
			Tarjan(G.To[k],root);
			Low[from]=Min(Low[from],Low[G.To[k]]);
			if(Dfn[from]<=Low[G.To[k]]){
				flag++;
				if(from!=root||flag>1)
					Cut[from]=true;
			}
		}
		else Low[from]=Min(Low[from],Dfn[G.To[k]]);
	}
}

inline void Work(){
	for(register int i=1;i<=n;i++)
		if(!Dfn[i])Tarjan(i,i);
}

注意事项 : : :

  1. 第 17 17 17 行的原则应判断G.To[k]!=dad , , , 但出于简洁和不影响正确性的前提 , , , 舍去了判断 , , , 请读者理解 . . .

点双连通分量缩点

每一个割点可能在多个点双连通分量 . . .

Graphs<MaxN,MaxM>G;
Stack<int,MaxN>S;
vector<int>VDcc[MaxN];
int Dfn[MaxN],Low[MaxN],tot;
bool Cut[MaxM];
int Belong[MaxN],vdcc;
inline void Tarjan(int from,int root){
	Dfn[from]=Low[from]=++tot;
	S.Push(from);
	if(from==root&&G.Last[from]==-1){
		VDcc[++vdcc].push_back(from);
		return;
	}
	int flag=0;
	for(register int k=G.Last[k];k!=-1;k=G.Next[k]){
		if(!Dfn[G.To[k]]){
			Tarjan(G.To[k],root);
			Low[from]=Min(Low[from],Low[G.To[k]]);
			if(Dfn[from]<=Low[G.To[k]]){
				flag++;
				if(from!=root||flag>1)
					Cut[from]=true;
				vdcc++;int now;
				do{
					now=S.Top();S.Pop();
					VDcc[vdcc].push_back(now);
				}while(now!=G.To[k]);
				VDcc[vdcc].push_back(from);
			}
		}
		else Low[from]=Min(Low[from],Dfn[G.To[k]]);
	}
}

Graphs<2*MaxN,2*MaxN>Tree;

inline void Work(){
	num=vdcc;
	for(register int i=1;i<=n;i++)
		if(Cut[i])Id[i]=++num;
	for(register int i=1;i<=vdcc;i++){
		int vsize=VDcc[i].size();//安全求稳 
		for(register int j=0;j<vsize;j++){
			if(Cut[VDcc[i][j]]){
				Insert(Tree,i,Id[VDcc[i][j]]);
				Insert(Tree,Id[VDcc[i][j]],i);
			}
			else Belong[VDcc[i][j]]=i;
		}
	}
}

边双连通分量缩点

int Belong[MaxN],edcc;
inline void Dfs(int from){
	Belong[from]=edcc;
	for(rgeister int k=G.Last[from];k!=-1;k=G.Next[k]){
		if(Belong[G.To[k]]||Bridge[k])continue;
		Dfs(G.To[k]);
	}
}

Graphs<MaxN,MaxN>Tree;

inline void Work(){
	for(register int i=1;i<=n;i++){
		if(!Belong[i]){
			edcc++;
			Dfs(i);
		}
	}
	for(register int i=0;i<G.cntm;i++){
		if(Belong[G.To[i^1]]==Belong[G.To[i]])continue;
		Insert(Tree,Belong[G.To[i^1]],Belong[G.To[i]]);
	}
}

注意事项 : : :

  1. 第 21 21 21 行没有连双向边的原因是这条边的反边也会被遍历 , , , 要理解透彻 . . .

有向图连通性

定义

T a r j a n Tarjan Tarjan 算法在 D f s Dfs Dfs 中维护了一个栈 : : :

  1. 搜索树上 x x x 的祖先节点 . . .
  2. 已访问的 , , , 存在一条路径到达 1 1 1 类的节点 . . .

D f n x Dfn_x Dfnx​ 为点 x x x 的时间戳 . . .
L o w x Low_x Lowx​ 为满足以下条件点的 D f n Dfn Dfn 的最小值 . . .

  1. 在栈中的节点 . . .
  2. 通过 1 1 1 条从搜索树上出发的有向边能到达的节点 . . .

强连通分量缩点

如果节点 x x x 的栈构成一个强连通分量 , , , 满足 : : :
D f n x = L o w x Dfn_x=Low_x Dfnx​=Lowx​
然而我不会证明 . . .

其实就是我的搜索子树到不了祖先 , , , 至于那些出栈的点 , , , 他自己都没能出来 , , , 不可能能到我们这 . . .

Graphs<MaxN,MaxM>G;
Stack<int,MaxN>S;
vector<int>Scc[MaxN];
int Dfn[MaxN],Low[MaxM],tot,scc;
bool Visit[MaxN];
inline void Tarjan(int from){
	Dfn[from]=Low[from]=++tot;
	S.Push(from);Visit[from]=true;
	for(register int k=G.Last[from];k!=-1;k=G.Next[k]){
		if(!Dfn[G.To[k]]){
			Tarjan(G.To[k]);
			Low[from]=Min(Low[from],Low[G.To[k]]);
		}
		else if(Visit[G.To[k]])
			Low[from]=Min(Low[from],Dfn[G.To[k]]);
	}
	if(Dfn[from]==Low[from]){
		scc++;int now;
		do{
			now=S.Top();S.Pop();Visit[now]=false;
			Belong[now]=scc;Scc[scc].push_back(now);
		}while(from!=now);
	}
}
Graphs<MaxN,MaxN>Tree;
inline void Work(){
	for(register int i=1;i<=n;i++)
		for(register int k=G.Last[i];k!=-1;k=G.Next[k]){
			if(Belong[i]==Belong[G.To[k]])continue;
			Insert(Tree,Belong[i],Belong[G.To[k]]);
		}
}

有向图的必经点和必经边

支配树

Dag Hash

信奥赛CSP-J复赛集训(图和树专题)(1):[蓝桥杯 2013 国 C] 危险系数 阅读详情

相关推荐

Zoom AI 技术架构研究:联合式方法与多模态集成

通过 Zoom AI 开放平台,企业可以自定义 AI 模块 (如法律合规审查、客户反馈分析),扩展应用场景。这种开放平台策略使企业能够根据自身需求定制 AI 功能,满足特定业务需求。

shao.bing的专栏 1317

图论.连通性专题

开一个关于图的连通性的专题,内容包括: 强连通分量 双连通分量 最大团 极大团 全局最小割 最短路相关 其他的想到了再补 转载于:https://www.cnblogs.com/Patt/p/6001434.html...

weixin_30596343的博客 137

NSGA-III相关笔记

NSGA-III目录目的区别NSGA-III的算法流程非支配排序详解归一化详解 目录 NSGA-III基于matlab的实现 参考文献 1.An Evolutionary Many-Objective Optimization Algorithm Using Reference-point Based Non-dominated Sorting Approach,Part I: Solving P...

weixin_42555400的博客 1万+

图论专题-并查集 连通性

输入: 第一行:结点数n和边数m 依次输入边(结点对) 输出: 还需要几条边使其连通(连通分量个数加1) #include<iostream> using namespace std; #define N 1000 int Tree[N]; int findRoot(int x){ if(Tree[x]==-1) return x; else{ int tmp=findRoot...

Jeniclala的博客 121

华为项目TR5评审后发现了重大缺陷的应急处理经验

华为TR5评审后发现重大缺陷时,启动分级应急机制:1)缺陷分级:按严重性(致命/严重/一般)评估影响;2)应急响应:跨部门会议制定方案,冻结生产并调配资源;3)根因修复:通过RCA定位问题,设计变更后回归测试;4)变更管理:评审修复影响,调整发布策略;5)持续改进:记录缺陷闭环,优化流程。案例显示,软件闪退问题通过热修复补丁和代码重构解决。关键工具包括Jira、FMEA等,确保缺陷在量产前拦截,降低风险。

从技术实践立足,从项目管理方法论延伸思考 1069

手把手教你用UNet实现轨道缺陷检测(附RSDDs数据集下载与完整代码)

本文详细介绍了如何使用UNet模型实现轨道缺陷检测,包括RSDDs数据集的下载与处理、UNet架构的改进与优化、训练策略设计以及模型部署的全流程。通过实战案例,展示了如何利用深度学习技术提升工业质检效率,特别适合从事工业缺陷检测和图像处理的开发者参考。

dapp9builder的博客 747

图论专题班连通性例题和练习

2022牛客 图论 连通性(强连通、割点和桥) 文章目录2022牛客 图论 连通性(强连通、割点和桥)概念双连通分量tarjan割点割边(桥)tarjan求割点,桥点联通分量强连通分量例题可达性[HAOI2006]受欢迎的牛[ZJOI2007]最大半连通子图 概念 双连通分量 如果一个图不存在割点,则它是一个点双连通图,一个图的极大点双连通子图是他的点双连通分量。 tarjan 时间戳dfndfndfn:第几个搜到这个点 返祖边:搜索树上一个点连向其祖先节点的边 追溯值lowlowlow:当前点及其子

weixin_50462620的博客 1170

手把手教你用Wireshark抓包分析BLE广播包:从PDU结构到AD Type实战解析

本文详细介绍了如何使用Wireshark工具抓取并分析BLE广播包,从PDU结构到AD Type的实战解析。通过硬件设备选择、软件配置、协议栈解析及高级故障排查,帮助开发者深入理解蓝牙低功耗通信机制,提升物联网设备调试效率。

weixin_30482383的博客 417

【专题】图的连通性问题

有向图的强连通分量 POJ 1236 - Network of Schools(基础) /** head-file **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #incl

Azarath Metrion Zinthos 1191

AI视频生成提示词工程:结构化公式与实战案例详解

在实际使用 AI 生成视频或图像时,最常遇到的困惑是:为什么我的提示词(Prompt)生成的画面总是不理想?是模型能力不足,还是我的描述有问题?答案往往是后者。提示词工程(Prompt Engineering)并非简单的“翻译”需求,而是一门需要结构化思维和精准描述的技能。它决定了 AI 能否准确理解你的意图,并生成符合预期的视觉内容。 本文将通过两个核心案例,深入拆解提示词的构建逻辑。第一个案例聚焦于“文生视频”,我们将学习如何将一个简单的想法,如“小猫在雪地里玩雪球”,通过结构化公式扩展为一段富有细节和

weixin_30800987的博客 556

偷懒必备:3种方法快速移植MFC界面资源(含.rc文件打不开解决方案)

本文针对MFC桌面应用开发,详细介绍了三种快速移植界面资源的实战方法:直接编辑.rc文件、利用Visual Studio“添加现有项”进行可视化挂载,以及双实例拖拽应急方案。文章重点剖析了.rc文件无法打开的常见问题,提供了通过修复rc.exe等关键文件来根治此问题的解决方案,帮助开发者高效复用资源,规避ID冲突等陷阱。

weixin_28358083的博客 272

连通性问题专题题解

唯一比线段树好的就是——板子不用改!!!

BLOGzhanghexuan的博客 65

android13删除录屏权限提示框-去除录屏提示

在Android 13中,当应用请求屏幕录制权限时,系统会弹出一个权限提示框,要求用户明确授权。这个提示框是为了增强用户隐私保护,让用户知道有应用尝试录制屏幕。但是,在某些情况下,开发者可能希望避免显示这个提示框,以提供更流畅的用户体验。本文将介绍如何在Android 13中删除录屏权限提示框。

zhutoubenben的专栏 1880

图的连通性问题专题整理

这一篇博客继续以一些OJ上的题目为载体,对图的连通性专题进行整理一下。会陆续的更新。。。爱上大声地一、相关定义1、如果图G中任意两点可以相互到达。则称图G为强连通图。2、如果图G不是强连通图,而它的子图G'是强连通图。那么称图G'为图G的强连通分量求强连通分量主要以下三种算法:Kosaraju算法、Tarjan算法、Garbow算法。。。二、例题1、HDU 12691)使用Tarjan算法来解决/

黄俊东的专栏 1681

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

专题讲座4 图的连通性和Tarjan算法 学习心得

题目都好抽象,但又有点套路

fanshui682的博客 280

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【专题】图的连通性问题---无向图的点连通性的求解及应用

1.求割点: (1).朴素的方法:n^3 (2).Tarjan求割点:n^2 顶点u是割点的充要条件: 1.如果顶点u是深度优先搜索生成树的根,则u至少有两个子女. 2.如果u不是生成树的根,则它至少有一个子女w,从w出发,不可能通过w、w的子孙,以及一条回边组成的路径到达u的祖先. (low[w]>=dfn[u]). 去掉割点,将原来的连通图分成了几个连通分量? 1.如果...

weixin_30695195的博客 404

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[双连通+割点+桥]无向图连通性问题专题

最近一直搞专辑,所以没写啥解题报告,今天终于搞完了一个,小结一下下 题目来源,LightOJ,在Problem Category里的Graph Theory里的Articulation/Bridge/Biconnected Component 1026 - Critical Links 裸题,找桥用tarjan算法即可解决 代码: #include #include #include

Airarts_的专栏 3516

近期计划

最近发现一个比较好的博客,准备跟刷:http://www.gonglin91.com/category/acm/dp/treedp/      以后把训练计划记下来吧。 前两天刷完LCA加一点点简单的树链剖分。 就打算进入2.5阶段吧,就是边刷专题边刷CF。这两天要搞电工电子实验,算计着在空余时间里先把G-rated上的连通性题目跟刷了,因为相对比较熟。接着再跟刷树DP。    

侧耳倾听 675

图论专题

图论专题数据结构邻接矩阵邻接表 数据结构 邻接矩阵 定义矩阵 Arrx,yArr_{x,y}Arrx,y​ 表示节点 xxx ,,, yyy 之间的信息 ... int Cost[MaxN][MaxN]; inline void Work(){ int from; for(register int to=1;to<=n;to++) if(Cost[from][to]!=-1)Cost[from][to]; } inline void Init(){ memset(Cost,-1,size

Darkside的博客 196

动态规划专题:算法合集之《基于连通性状态压缩动态规划问题》

重点参考两篇冬令营论文: http://wenku.baidu.com/view/a6dce6c76137ee06eff918d1.html http://wenku.baidu.com/view/66f6bb23482fb4daa58d4ba9.html

NOI2015的专栏 615

UE中如何实现最佳路径分析

作者姜尔 本文主要讲述在SuperMap Hi-Fi 3D SDK for Unreal产品11.2.0中, 判断三维官网数据中指定两点的连通性。技术思路为使用交通网络分析服务,对两点查询返回结果后,于UE中渲染显示结果。

SuperMap技术控 1190

畅通工程

GDUT 2020寒假训练 专题图论 H 原题链接 GDUT-专题图论-H 畅通工程 题目大意 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是...

xcy2001的博客 226

Hot100中的:图论专题

并查集 = 用来判断两个东西是不是在同一个集合里,它解决了判断这两个点是不是连在一起的问题。遍历网格,遇到陆地就用 DFS / BFS 把整块连通陆地淹掉,并计数。把字符串拆成路径存进树里,用共享前缀实现高效查找与前缀匹配。多源 BFS,扩散一层就是一分钟。用拓扑排序判断有向图中是否存在环。

2402_83663214的博客 333
上一篇: 线段树专题
下一篇: 图论专题
DarksideCoder
博客等级 码龄7年 34粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值