最近做 B 站弹幕分析 的项目,学习 Jieba 中文分词的动态规划算法,发现自己的算法知识待系统的学习,遂读 Sedgewick 的《算法 C 实现第三版》,这一系列算法的代码放在 Github,文章会同步到 SF,随意转载。
连通性问题
问题概述
先来看一张图:
在这个彼此连接和断开的点网络中,我们可以找到一条 p 点到 q 点的路径。在计算机网络中判断两台主机是否连通、在社交网络中判断两个用户是否存在间接社交关系等,都可以抽象成连通性问题。
问题抽象
可将网络中的点(主机、人)抽象为对象,p-q
表示 p连接到q,连通关系可传递: p-q & q-r => p-r
;为简述问题,将两个对象标记为一个整数对,则给定整数对序列就能描述出点网络。
如下图结点数 N = 5 的网络(使用 0 ~ N-1表示对象),可用整数对序列 0-1 1-3 2-4
来描述连通关系, 其中 0 和 3 也是连通的,存在两个连通分量:{0, 1, 3} 和 {2, 4}
问题:给定描述连通关系的整数对序列,任给其中两个整数 p 和 q,判断其是否能连通?
问题示例
输入 不连通 连通
3-4 3-4
4-9 4-9
8-0 8-0
2-3 2-3
5-6 5-6
2-9 2-3-4-9
5-9 5-9
7-3 7-3
4-8 4-8
5-6 5-6
0-2 0-8-4-3-2
6-1 6-1
对应的连通图如下,黑线表示首次连接两个结点,绿线表示两结点已存在连通关系:
算法一:快速查找算法
使用数组 id[i]
存储结点的值, i
为结点序号,即初始状态序号和数组值相同 :