在离散数学中,图论是一个非常重要的分支,它广泛应用于计算机科学、网络设计、社会网络分析等领域。掌握图论的基本概念和技巧对于解决实际问题至关重要。以下是一些经典的图论例题,帮助你轻松上手并破解图论难题。
例题一:图的遍历
问题描述:给定一个无向图,请编写一个程序,找出图中所有顶点的度数,并判断图是否为连通图。
解题思路:
- 使用邻接矩阵或邻接表表示图。
- 遍历所有顶点,计算每个顶点的度数。
- 使用深度优先搜索(DFS)或广度优先搜索(BFS)判断图是否连通。
代码示例:
def degree_of_vertices(graph):
degree = {}
for vertex in graph:
degree[vertex] = sum(graph[vertex])
return degree
def is_connected(graph):
visited = set()
def dfs(vertex):
visited.add(vertex)
for neighbor in graph[vertex]:
if neighbor not in visited:
dfs(neighbor)
dfs(next(iter(graph)))
return len(visited) == len(graph)
# 示例图
graph = {
'A': ['B', 'C'],
'B': ['A', 'C', 'D'],
'C': ['A', 'B', 'D'],
'D': ['B', 'C']
}
degree = degree_of_vertices(graph)
print("顶点度数:", degree)
print("图是否连通:", is_connected(graph))
例题二:最小生成树
问题描述:给定一个加权无向图,请找出该图的最小生成树。
解题思路:
- 使用克鲁斯卡尔算法或普里姆算法求解最小生成树。
- 克鲁斯卡尔算法:按边的权重排序,使用并查集判断边是否形成环,逐步添加边。
- 普里姆算法:从任意顶点开始,逐步添加边,直到生成树包含所有顶点。
代码示例:
def kruskal(graph):
edges = sorted(graph.items(), key=lambda x: x[1])
forest = {}
for vertex in graph:
forest[vertex] = {vertex}
mst = []
for edge in edges:
u, v = edge[0]
if forest[u] is not forest[v]:
mst.append(edge)
forest[u] = forest[v]
return mst
def prim(graph):
mst = []
visited = set()
u = next(iter(graph))
visited.add(u)
for v in graph[u]:
mst.append((u, v, graph[u][v]))
while len(visited) < len(graph):
min_edge = None
for u in visited:
for v in graph[u]:
if v not in visited and (min_edge is None or graph[u][v] < graph[min_edge[0]][min_edge[1]]):
min_edge = (u, v)
mst.append(min_edge)
visited.add(min_edge[1])
return mst
# 示例图
graph = {
'A': {'B': 2, 'C': 3},
'B': {'A': 2, 'C': 1, 'D': 1},
'C': {'A': 3, 'B': 1, 'D': 3},
'D': {'B': 1, 'C': 3}
}
mst_kruskal = kruskal(graph)
mst_prim = prim(graph)
print("克鲁斯卡尔算法最小生成树:", mst_kruskal)
print("普里姆算法最小生成树:", mst_prim)
例题三:最大匹配
问题描述:给定一个二分图,请找出图中的最大匹配。
解题思路:
- 使用匈牙利算法求解最大匹配。
- 遍历所有顶点,使用DFS寻找增广路径,并逐步增加匹配数。
代码示例:
def hungarian(graph):
def dfs(u):
for v in graph[u]:
if visited[v] == 0:
visited[v] = 1
if match[v] == -1 or dfs(match[v]):
match[v] = u
return True
return False
n = len(graph)
match = [-1] * n
visited = [0] * n
for u in range(n):
while True:
visited = [0] * n
if dfs(u):
break
return match
# 示例图
graph = {
0: [1, 2],
1: [0, 2],
2: [0, 1]
}
max_matching = hungarian(graph)
print("最大匹配:", max_matching)
通过以上经典例题,相信你已经对离散数学图论有了更深入的了解。在实际应用中,不断练习和总结,相信你能够轻松解决各种图论难题。
