蒟蒻对并查集的实际应用2:求无向图最大连通块结点数

1.连通图和连通分量

无向图G的极大连通子图称为G的连通分量( Connected Component)。任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量。

1.相关概念
这里写图片描述
2.求无向图的连通分量
这里写图片描述
2.连通图

定义:在图论中,连通图基于连通的概念。在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称i和j是连通的。如果 G 是有向图,那么连接i和j的路径中所有的边都必须同向。如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图(注意:需要双向都有路径)。图的连通性是图的基本性质。

性质一个无向图 G=(V,E) 是连通的,那么边的数目大于等于顶点的数目减一:|E|>=|V|-1,而反之不成立。
如果 G=(V,E) 是有向图,那么它是强连通图的必要条件是边的数目大于等于顶点的数目:|E|>=|V|,而反之不成立。
没有回路的无向图是连通的当且仅当它是树,即等价于:|E|=|V|-1

3.并查集求连通块的个数

例题1:亲戚个数(洛谷P1551)

题目描述
题目背景
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
题目描述
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
输入输出格式
输入格式:
第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。
以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Mi和Mj具有亲戚关系。
接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。
输出格式:
P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。
输入输出样例
输入样例#1:
6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6
输出样例#1:
Yes
Yes
No

附源码:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里给出一个使用并查集计算网络的最大连通的Python实现,并与基于Networkx计算的结果进行比较。 首先,我们需要导入必要的库: ```python import networkx as nx import numpy as np ``` 然后,我们可以定义一个函来使用并查集计算最大连通。这里,我们使用一个字典来表示每个节点的父节点,初始化时每个节点的父节点都是它自己。然后,我们遍历所有连接节点的边,将它们所连接的节点进行合并操作。最后,我们遍历每个节点,并找到它所属的集合。我们使用一个字典来记录每个集合的大小,最终找到最大的集合,即为最大连通。 ```python def max_connected_piece(G): # 初始化每个节点的父节点 parent = {n:n for n in G.nodes} # 合并连接的节点 for n1, n2 in G.edges: while parent[n1] != n1: n1 = parent[n1] while parent[n2] != n2: n2 = parent[n2] if n1 != n2: parent[n1] = n2 # 统计每个集合的大小 sizes = {} for n in G.nodes: while parent[n] != n: n = parent[n] if n in sizes: sizes[n] += 1 else: sizes[n] = 1 # 找到最大连通 max_size = max(sizes.values()) max_piece = [n for n in sizes if sizes[n] == max_size] return max_piece ``` 接下来,我们可以定义一个函来使用Networkx计算最大连通。我们使用nx.connected_components函查找网络中的所有连通分量,然后找到最大连通分量。 ```python def max_connected_piece_networkx(G): # 查找所有连通分量 components = nx.connected_components(G) # 找到最大连通 max_size = 0 for component in components: size = len(component) if size > max_size: max_size = size max_piece = component return max_piece ``` 最后,我们可以测试这两个函,并将它们的结果进行比较: ```python # 创建一个随机的网络 G = nx.gnp_random_graph(100, 0.1) # 使用并查集计算最大连通 max_piece = max_connected_piece(G) # 使用Networkx计算最大连通 max_piece_networkx = max_connected_piece_networkx(G) # 比较两个结果 if set(max_piece) == set(max_piece_networkx): print("结果相同") else: print("结果不同") ``` 希望这个Python实现能够帮助您理解如何使用并查集计算网络的最大连通,并与基于Networkx计算的结果进行比较。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值