📜  数学 |图论实践题(1)

📅  最后修改于: 2023-12-03 15:39:57.562000             🧑  作者: Mango

数学 | 图论实践题

简介

本文主要介绍一些数学和图论相关的实践题,帮助程序员实际应用已学知识。

数学实践题
1. 最大公约数

给定两个正整数,求它们的最大公约数。

def gcd(a, b):
    if b == 0:
        return a
    else:
        return gcd(b, a % b)
2. 最小公倍数

给定两个正整数,求它们的最小公倍数。

def lcm(a, b):
    return a * b / gcd(a, b)
3. 快速幂

给定正整数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
4. 筛法求质数

给定正整数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]]
图论实践题
1. 求无向图中的联通分量

给定一个无向图,求它的联通分量。

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
2. 求有向图中的拓扑排序

给定一个有向图,求它的一个拓扑排序。

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 []
3. 求有向图中的最长路

给定一个有向无环图,求它的一个最长路。

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
结语

以上就是一些数学和图论的实践题,大家可以针对自己的需要选择适合自己的题目进行练习。