离散数学(10)——通路与回路、无向图与有向图的连通性、无向图的连通度

一、通路与回路
1、通路:
  • 顶点与边的交替序列
2、起点, 终点, 通路长度
  • 第一个点是起点,最后一个点是终点
  • 通路长度 |Γ| = l
3、回路
  • 首尾相连的通路,起点与终点是同一个点
4、简单(复杂、初级)通(回)路
  • 简单通路: 没有重复边的通路
  • 简单回路: 没有重复边的回路
  • 复杂通路: 有重复边的通路
  • 复杂回路: 有重复边的回路
  • 初级通路(路径): 没有重复顶点的通路
  • 初级回路(圈): 没有重复顶点的回路
5、通(回)路的表示
  • 可以只用边的序列来表示通(回)路
  • 简单图可以只用顶点的序列来表示通(回)路
6、圈的表示
  • 画出的长度为l 的圈
    • 如果是非标定的, 则在同构意义下是唯一的
    • 如果是标定的(指定起点,终点), 则是l个不同的圈
7、周长
  • G是含圈的无向简单图
  • c(G)=最长圈的长度
  • c(Kn)=n (n≥3) c(Kn,n)=2n
8、围长
  • G是含圈的无向简单图
  • g(G)=最短圈的长度
  • g(Kn)=3 (n≥3), g(Kn,n)=4 (n≥2)
9、极大路径
  • 在无向简单图中, 路径的两个端点不与路径本身以外的顶点相邻, 这样的路径称为极大路径
  • 在有向图中, 路径起点的前驱,终点的后继,都在路径本身上

扩大路径法

  • 任何一条路径,只要不是极大路径,则至少有一个端点与路径本身以外的顶点相邻, 则路径还可以扩大, 直到变成极大路径为止
二、无向图的连通性
1、连通
  • 无向图G=<V,E>, u~v ⟺ u与v之间有通路, 规定u~u
  • 连通关系~是等价关系
    • 自反: u~u
    • 对称: u~v ⇒ v~u
    • 传递: u~v ∧ v~w ⇒ u~w
  • 连通分支: G[Vi], (i=1,…,k)
    • 设 V/~ = { Vi | i=1,…,k }
    • 连通分支数: p(G) = |V/~| = k
  • 连通图: p(G)=1; 非连通图(分离图): p(G)>1
2、距离、直径
  • 距离:dG(u,v) = u,v之间短程线的长度(或∞)
  • 直径:d(G) = max{ dG(u,v) | u,v∈V(G) }
3、距离函数
  • 非负性: d(u,v)≥0, d(u,v)=0 ⟺ u=v
  • 对称性: d(u,v) = d(v,u)
  • Δ不等式: d(u,v) + d(v,w) ≥ d(u,w)
  • 任何函数只要满足上述三条性质, 就可以当作距离函数使用
4、(双向)可达
  • 有向图D=<V,E>, u→v ⟺ 从u到v有(有向)通路
    • 规定u→u,可达关系是自反, 传递的
  • 有向图D=<V,E>, u↔v ⟺ u→v ∧ v→u
    • 双向可达关系是等价关系
    • 其等价类的导出子图称为强连通分支
5、单向连通
  • 有向图的任何一对顶点之间至少单向可达
6、强连通
  • 强连通(双向连通): 有向图的任何一对顶点之间都双向可达
7、有向图的连通分支
  • 强连通分支: 极大强连通子图
  • 单向连通分支: 极大单向连通子图
  • 弱连通分支: 极大弱连通子图
三、无向图的连通度
1、点连通度、边连通度
  • 点连通度:为了破坏连通性,至少需要删除多少个顶点?
  • 边连通度:为了破坏连通性,至少需要删除多少条边?
  • “破坏”连通性:
    • p(G-V’) > p(G)
    • p(G-E’) > p(G)
    • 连通分支数增加
2、点割集
  • G=<V,E>, ∅≠V’⊂V,

    • (1) p(G-V’)>p(G) (破坏连通性
      (2) ∀ V’’⊂V’, p(G-V’’)=p(G) (极小性条件)
  • 割点

    • v是割点 ⟺ {v}是割集
3、边割集
  • G=<V,E>, ∅≠E’⊂E
    • (1) p(G-E’)>p(G) (破坏连通性)
      (2) ∀E’’⊂E’, p(G-E’’)=p(G) (极小性条件)
  • 割边 (桥)
    • (u,v)是割边 ⟺ {(u,v)}是边割集
  • 13
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 你好!针对你的问题,可以使用Kruskal算法来解决加权无向图的最大连通分量问题。下面是Python代码实现: ```python class Graph: def __init__(self, vertices): self.V = vertices self.graph = [] def add_edge(self, u, v, w): self.graph.append([u, v, w]) def find(self, parent, i): if parent[i] == i: return i return self.find(parent, parent[i]) def union(self, parent, rank, x, y): xroot = self.find(parent, x) yroot = self.find(parent, y) if rank[xroot] < rank[yroot]: parent[xroot] = yroot elif rank[xroot] > rank[yroot]: parent[yroot] = xroot else: parent[yroot] = xroot rank[xroot] += 1 def kruskal(self): result = [] i = 0 e = 0 self.graph = sorted(self.graph, key=lambda item: item[2], reverse=True) parent = [] rank = [] for node in range(self.V): parent.append(node) rank.append(0) while e < self.V - 1: u, v, w = self.graph[i] i = i + 1 x = self.find(parent, u) y = self.find(parent, v) if x != y: e = e + 1 result.append([u, v, w]) self.union(parent, rank, x, y) return result ``` 这里通过Kruskal算法实现了对加权无向图的最大连通分量的求解。在这个算法中,首先将图按边的权值从大到小排序,然后依次选择边判断是否构成环,如果不构成环,则将其加入最大连通分量中,直到找到V-1条边或者所有边都被处理完毕为止。 使用时,可以先创建一个Graph对象,然后调用add_edge方法添加图中的边,最后调用kruskal方法求解最大连通分量。 ### 回答2: 加权无向图的最大连通分量问题,可以通过深优先搜索(DFS)或广优先搜索(BFS)来解决。 首先,我们需要定义一个图的类,表示加权无向图,并提供相应的方法来构建图和进行搜索。在构建图的过程中,我们需要存储顶点和它们之间的边的关系以及权重。 接下来,我们可以使用DFS或BFS来搜索最大连通分量。以DFS为例,首先初始化一个数组visited,用于记录每个顶点是否已经被访问过。然后,我们从图中的每个顶点开始进行搜索,每次搜索得到的连通分量都是当前最大的连通分量。具体步骤如下: 1. 初始化一个空的最大连通分量集合max_component。 2. 对于图中的每个顶点v,如果v未被访问过,执行以下步骤: - 初始化一个空的连通分量集合component。 - 将v标记为已访问。 - 使用DFS从v开始对图进行搜索,将搜索到的所有未访问过的顶点添加到component中。 - 如果component的权重大于max_component的权重,则将component赋值给max_component。 3. 返回max_component。 下面是一个使用DFS来解决加权无向图最大连通分量问题的Python代码段: ``` class Graph: def __init__(self, vertices): self.V = vertices self.adj = [[] for _ in range(vertices)] def addEdge(self, u, v, w): self.adj[u].append((v, w)) self.adj[v].append((u, w)) def DFS(self, v, visited, component): visited[v] = True component.append(v) for neighbor, _ in self.adj[v]: if not visited[neighbor]: self.DFS(neighbor, visited, component) def findMaxComponent(self): visited = [False] * self.V max_component = [] for v in range(self.V): if not visited[v]: component = [] self.DFS(v, visited, component) if len(component) > len(max_component): max_component = component return max_component ``` 以上代码中,我们定义了一个Graph类,包含了构建图和执行DFS搜索的方法。使用addEdge方法构建图,使用findMaxComponent方法来找到最大连通分量。 最后,我们可以按照以下方式使用这个图类来解决问题: ``` g = Graph(4) g.addEdge(0, 1, 3) g.addEdge(1, 2, 5) g.addEdge(2, 3, 2) max_component = g.findMaxComponent() print("最大连通分量:", max_component) ``` 上述代码中,我们创建了一个包含4个顶点的加权无向图,并添加了3条边。然后,我们调用findMaxComponent方法找到图的最大连通分量,并将结果打印输出。 希望上述解答对你有帮助! ### 回答3: 加权无向图的最大连通分量,是指在一个加权无向图中,找到一个子图,使得这个子图中的所有节点之间都有通路,并且这个子图的总权重最大。 在Python中,可以使用深优先搜索(DFS)或广优先搜索(BFS)的方式来解决这个问题。以下是使用DFS的实现方法: 1. 首先,定义一个函数来执行DFS: ``` def DFS(graph, visited, start, max_weight, current_weight, component): visited[start] = True current_weight += graph[start][start] # 累加当前节点的权重 if current_weight > max_weight: max_weight = current_weight # 更新最大权重 component.append(start) # 将当前节点添加到连通分量中 for neighbor in graph[start]: if not visited[neighbor]: max_weight, current_weight, component = DFS(graph, visited, neighbor, max_weight, current_weight, component) return max_weight, current_weight, component ``` 2. 然后,定义一个函数来查找最大连通分量: ``` def find_max_connected_component(graph): max_weight = 0 # 最大权重 max_component = [] # 最大连通分量 visited = [False] * len(graph) # 记录节点是否已访问 for node in range(len(graph)): if not visited[node]: current_weight = 0 # 当前连通分量的权重 component = [] # 当前连通分量 max_weight, current_weight, component = DFS(graph, visited, node, max_weight, current_weight, component) if current_weight > max_weight: max_weight = current_weight max_component = component return max_component ``` 3. 最后,使用上述函数来查找最大连通分量: ``` graph = [ [0, 2, 3, 0], [2, 0, 0, 4], [3, 0, 0, 5], [0, 4, 5, 0] ] max_connected_component = find_max_connected_component(graph) print(max_connected_component) ``` 上述代码中,graph表示一个加权无向图的邻接矩阵,其中0表示两个节点之间没有边,非零数字表示边的权重。函数find_max_connected_component返回最大连通分量的节点列表。在上述示例中,最大连通分量节点列表为[0, 1, 3],对应的节点权重总和为6。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值