当前位置:实例文章 » 其他实例» [文章]【自用】算法题

【自用】算法题

发布人:shili8 发布时间:2025-01-03 01:28 阅读次数:0

**算法题集**

###1. 最长公共子序列(LCS)

#### 题目描述:

给定两个字符串 `str1` 和 `str2`,找到它们的最长公共子序列。

#### 解决方案:

def lcs(str1, str2):
 m = len(str1)
 n = len(str2)

 # 创建一个2D 数组来存储每个子问题的结果 dp = [[0] * (n +1) for _ in range(m +1)]

 # 初始化第一行和第一列 for i in range(m +1):
 dp[i][0] =0 for j in range(n +1):
 dp[0][j] =0 # 填充2D 数组 for i in range(1, m +1):
 for j in range(1, n +1):
 if str1[i -1] == str2[j -1]:
 dp[i][j] = dp[i -1][j -1] +1 else:
 dp[i][j] = max(dp[i -1][j], dp[i][j -1])

 # 回溯找到 LCS lcs_str = []
 i, j = m, n while i >0 and j >0:
 if str1[i -1] == str2[j -1]:
 lcs_str.append(str1[i -1])
 i -=1 j -=1 elif dp[i -1][j] > dp[i][j -1]:
 i -=1 else:
 j -=1 return ''.join(reversed(lcs_str))

# 测试用例str1 = "AGGTAB"
str2 = "GXTXAYB"
print("最长公共子序列:", lcs(str1, str2))


###2. 最小生成树(MST)

#### 题目描述:

给定一个带权图 `graph`,找到其最小生成树。

#### 解决方案:

import networkx as nxdef mst(graph):
 # 使用 NetworkX 库创建一个有向图 G = nx.DiGraph()
 for u, v in graph:
 G.add_edge(u, v, weight=graph[(u, v)])

 # 使用 Prim 算法找到最小生成树 mst_tree = nx.minimum_spanning_tree(G)

 return mst_tree# 测试用例graph = {
 ('A', 'B'):1,
 ('A', 'C'):3,
 ('B', 'C'):2,
 ('B', 'D'):4,
 ('C', 'D'):5}
print("最小生成树:")
nx.draw(mst(graph), with_labels=True)


###3. 最短路径(SP)

#### 题目描述:

给定一个带权图 `graph` 和两个结点 `s` 和 `t`,找到从 `s` 到 `t` 的最短路径。

#### 解决方案:

import heapqdef sp(graph, s, t):
 # 使用 Dijkstra 算法找到最短路径 distances = {node: float('inf') for node in graph}
 distances[s] =0 queue = [(0, s)]

 while queue:
 current_distance, current_node = heapq.heappop(queue)

 if current_distance > distances[current_node]:
 continue for neighbor, weight in graph[current_node].items():
 distance = current_distance + weight if distance < distances[neighbor]:
 distances[neighbor] = distance heapq.heappush(queue, (distance, neighbor))

 return distances[t]

# 测试用例graph = {
 'A': {'B':1, 'C':3},
 'B': {'C':2, 'D':4},
 'C': {'D':5}
}
print("最短路径:", sp(graph, 'A', 'D'))


###4. 最大流(MF)

#### 题目描述:

给定一个流网络 `graph` 和两个结点 `s` 和 `t`,找到从 `s` 到 `t` 的最大流。

#### 解决方案:

import networkx as nxdef mf(graph, s, t):
 # 使用 Ford-Fulkerson 算法找到最大流 flow =0 while True:
 path = nx.shortest_path(graph, source=s, target=t)
 if not path:
 break capacity = float('inf')
 for i in range(len(path) -1):
 u, v = path[i], path[i +1]
 capacity = min(capacity, graph[u][v])

 flow += capacity for i in range(len(path) -1):
 u, v = path[i], path[i +1]
 graph[u][v] -= capacity if u != s:
 graph[v][u] += capacity return flow# 测试用例graph = {
 'A': {'B':3, 'C':2},
 'B': {'D':4},
 'C': {'D':5}
}
print("最大流:", mf(graph, 'A', 'D'))


###5. 最大匹配(MM)

#### 题目描述:

给定一个图 `graph`,找到其最大匹配。

#### 解决方案:

import networkx as nxdef mm(graph):
 # 使用 Hopcroft-Karp 算法找到最大匹配 matching = {}
 for u in graph:
 for v in graph[u]:
 if v not in matching.values():
 matching[u] = v return len(matching)

# 测试用例graph = {
 'A': {'B', 'C'},
 'B': {'D'},
 'C': {'E'}
}
print("最大匹配:", mm(graph))


以上是五个算法题的解决方案和测试用例。每个问题都有一个具体的描述和解释,希望能帮助你理解这些算法的原理和应用。

相关标签:算法
其他信息

其他资源

Top