📅  最后修改于: 2023-12-03 15:39:57.562000             🧑  作者: Mango
本文主要介绍一些数学和图论相关的实践题,帮助程序员实际应用已学知识。
给定两个正整数,求它们的最大公约数。
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
给定两个正整数,求它们的最小公倍数。
def lcm(a, b):
return a * b / gcd(a, b)
给定正整数a、b、m,求a^b % m的值。
def qpow(a, b, m):
res = 1
while b > 0:
if b & 1:
res = res * a % m
a = a * a % m
b >>= 1
return res
给定正整数n,求小于等于n的所有质数。
import math
def get_primes(n):
is_prime = [True] * (n + 1)
for i in range(2, int(math.sqrt(n)) + 1):
if is_prime[i]:
j = i * i
while j <= n:
is_prime[j] = False
j += i
return [i for i in range(2, n + 1) if is_prime[i]]
给定一个无向图,求它的联通分量。
def dfs(x, graph, visited):
visited[x] = True
for y in graph[x]:
if not visited[y]:
dfs(y, graph, visited)
def get_connected_components(n, graph):
visited = [False] * (n + 1)
components = []
for i in range(1, n + 1):
if not visited[i]:
component = []
dfs(i, graph, visited)
for j in range(1, n + 1):
if visited[j]:
component.append(j)
components.append(component)
return components
给定一个有向图,求它的一个拓扑排序。
from collections import deque
def get_indegrees(n, edges):
indegrees = [0] * (n + 1)
for u, v in edges:
indegrees[v] += 1
return indegrees
def topological_sort(n, edges):
indegrees = get_indegrees(n, edges)
q = deque([i for i in range(1, n + 1) if indegrees[i] == 0])
order = []
while q:
u = q.popleft()
order.append(u)
for v in graph[u]:
indegrees[v] -= 1
if indegrees[v] == 0:
q.append(v)
return order if len(order) == n else []
给定一个有向无环图,求它的一个最长路。
def longest_path(n, edges, source):
dist = [-float('inf')] * (n + 1)
dist[source] = 0
for _ in range(n - 1):
for u, v, w in edges:
if dist[u] != -float('inf') and dist[u] + w > dist[v]:
dist[v] = dist[u] + w
return dist
以上就是一些数学和图论的实践题,大家可以针对自己的需要选择适合自己的题目进行练习。