📜  查找均匀距离处的节点对数 |第 2 组(使用 BFS)(1)

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

查找均匀距离处的节点对数 | 第 2 组 (使用 BFS)
背景

在一个无向图中,我们需要查找所有相隔 $K$ 个单位距离的节点对数。具体而言,对于一个给定的整数 $K>0$,我们需要查找图中所有的节点对 $(u,v)$,使得 $u$ 和 $v$ 之间的距离为 $K$。

思路

本题可以使用广度优先搜索算法 (BFS) 求解。具体而言,从图中的每个节点开始,以该节点为起点,进行 BFS 搜索,查找和该节点的距离为 $K$ 的所有节点。

为了防止重复计数,我们需要在每个节点开始搜索前,将已经搜索过的节点标记起来。在搜索完成后,将这些节点的标记清除,以便进行下一次搜索。

代码示例
from collections import deque

def bfs(node, k, visited, adj_list):
    """
    从节点 node 开始进行 BFS 搜索,查找距离为 k 的所有节点。
    """
    # 初始化 BFS 队列,并将起点 node 加入队列中
    q = deque([node])
    # 设置节点 node 的标记为已访问
    visited[node] = True
    # 记录距离为 k 的节点数
    count = 0

    # 进行 BFS 搜索
    while q:
        # 取出队首节点
        cur_node = q.popleft()
        # 若当前节点的距离为 k,则记录节点数
        if k == 0:
            count += 1
        # 否则,将当前节点的未访问邻居节点全部加入队列中
        else:
            for neighbor in adj_list[cur_node]:
                if not visited[neighbor]:
                    q.append(neighbor)
                    visited[neighbor] = True
            # 将 k 值减 1,继续进行 BFS 搜索
            k -= 1

    # 清除已访问节点的标记
    for v in visited:
        visited[v] = False

    return count

def find_pairs(graph, k):
    """
    查找距离为 k 的所有节点对数。
    """
    # 初始化已访问节点标记
    visited = {v: False for v in graph}
    # 记录节点对数
    pairs = 0

    # 遍历每个节点,以该节点为起点进行 BFS 搜索
    for node in graph:
        # 统计距离为 k 的节点数
        count = bfs(node, k, visited, graph)
        # 计算节点对数
        pairs += count * (count - 1) // 2

    return pairs // 2
时间复杂度

本算法的时间复杂度为 $O(N \cdot (M + E))$,其中 $N$、$M$ 和 $E$ 分别为图中的节点数、平均度数和边数。

空间复杂度

本算法的空间复杂度为 $O(N + E)$,其中 $N$ 和 $E$ 分别为图中的节点数和边数。