查找等距节点对的数量

data structurec++programming

要找出图中等距节点集的数量,我们将使用图遍历算法。从每个节点开始,我们执行遍历,例如广度优先查找 (BFS) 或深度优先查找 (DFS),并从起始节点跟踪所有节点的距离。在导航过程中,我们计算经过等距节点的数量。通过对所有节点重复此操作,我们可以得到图中等距节点集的完整列表。这种方法使我们能够有效地确定满足给定条件的节点集的数量,适用于不同的图结构。

使用的方法

  • 图遍历方法

  • DFS

图遍历方法

图遍历方法用于查找确实距离处的节点集的数量,包括使用遍历算法(例如深度优先搜索 (DFS) 或广度优先搜索 (BFS))检查图。从图中的每个节点开始,我们导航其相邻的节点并跟踪节点之间的距离。通过计算遍历过程中经历的确实距离处的节点数,我们可以确定确实距离处的节点集的数量。这种方法有效地分析了图表结构,以识别和统计所需的枢纽集,从而为解决此类问题提供了可靠的策略。

算法

  • 制作图表的连续列表或连续格子表示。

  • 初始化变量"tally"以跟踪距离确实相等的枢纽集的检查。

  • 遍历图表中的每个枢纽。

  • 对于每个枢纽,初始化一条线和一个单独的计数器。

  • 将当前枢纽排入线并将其标记为已访问。

  • 当线未清除时,执行以下步骤:

  • 从队列中取消一个枢纽队列。

    遍历其邻近节点。

    如果邻近枢纽未被访问,则将其排入队列并将其标记为已访问。

    增加邻近节点的单独计数器。

    在导航到当前枢纽可到达的所有枢纽后,检查单独计数器是否为偶数。

  • 如果是,则将检查变量增加从当前节点经过的枢纽数量。

    如果是奇数,则忽略从当前节点访问的枢纽。

    对图中的所有枢纽重复步骤 4-7。

  • 返回计数变量的值,该值表示图表中任何给定位置的枢纽组数。

示例

#include <iostream>
#include <vector>
#include <queue>

int countNodesAtEvenDistance(std::vector<std::vector<int>>& graph) {
    int count = 0;

    std::vector<bool> visited(graph.size(), false);

    for (int node = 0; node < graph.size(); ++node) {
        std::queue<int> q;
        int distance = 0;

        q.push(node);
        visited[node] = true;

        while (!q.empty()) {
            int current = q.front();
            q.pop();

            for (int neighbor : graph[current]) {
                if (!visited[neighbor]) {
                    visited[neighbor] = true;
                    q.push(neighbor);

                    distance++;

                    if (distance % 2 == 0) {
                        count += q.size();
                    }
                }
            }
        }
    }

    return count;
}

int main() {
    std::vector<std::vector<int>> graph = {
        {1, 2},
        {0, 2, 3},
        {0, 1, 3},
        {1, 2, 4},
        {3}
    };

    int pairCount = countNodesAtEvenDistance(graph);
    std::cout << "偶数距离的节点对计数:" << pairCount << std::endl;

    return 0;
}

输出

偶数距离的节点对计数:3

DFS

可以使用 DFS(深度优先查找)方法找到位于真正独立位置的节点集计数。从图表中的节点开始,我们执行深度优先遍历,遍历其所有相邻节点。在遍历过程中,我们维护一个单独的计数器,用于跟踪与起始节点的距离。当我们到达真正独立距离的节点时,我们将集数增加奇数距离处已经遇到的节点数。情况通常如此,因为对于确实分离的每个枢纽而言,都存在与奇数分离的每个枢纽之间的潜在组合。通过利用 DFS 调查整个图表,我们能够确定确实可以有效移除的枢纽集的数量。

算法

  • 将计数器变量 pairCount 初始化为 0。

  • 从图中的每个枢纽开始执行 DFS 遍历:

    • 将当前枢纽标记为已访问。

    • 初始化一个单独的计数器,从 0 开始。

    • 使用参数 (currentNode、distance) 调用助手工作 dfs。

  • 在 dfs 函数中:

    • 将分离增加 1。

    • 检查分离是否确实如果是,则将 pairCount 增加奇数个节点所处的距离。

    • 对每个未访问的相邻节点递归调用 dfs 函数,并将相邻节点和更新后的路径作为参数传递。

  • 对图中的所有未访问节点重复步骤 2 和 3。

  • 返回 pairCount 的最终值,它表示确实独立的节点集的数量。

示例

#include <iostream>
#include <vector>

void dfs(const std::vector<std::vector<int>>& graph, int node, std::vector<int>& dist, std::vector<bool>& vis, int c) {
    if (vis[node]) {
        return;
    }
    vis[node] = true;
    dist[node] = c;

    for (int i = 0; i < graph[node].size(); i++) {
        if (!vis[graph[node][i]]) {
            dfs(graph, graph[node][i], dist, vis, c + 1);
        }
    }
}

int countOfNodes(const std::vector<std::vector<int>>& graph, int n) {
    std::vector<bool> vis(n + 1, false);
    std::vector<int> dist(n + 1, 0);

    dfs(graph, 1, dist, vis, 0);

    int even = 0, odd = 0;
    for (int i = 1; i <= n; i++) {
        if (dist[i] % 2 == 0) {
            even++;
        } else {
            odd++;
        }
    }

    int ans = (even * (even - 1) + odd * (odd - 1)) / 2;
    return ans;
}

int main() {
    int n = 5;
    std::vector<std::vector<int>> graph = {
        {},
        {2},
        {1, 3},
        {2}
    };

    int ans = countOfNodes(graph, n);
    std::cout << ans << std::endl;

    return 0;
}

输出

6

结论

本文阐明了如何在图中找出精确距离处的节点集的比值。它讨论了两种方法:图遍历方法和 DFS 方法。图遍历方法包括使用广度优先搜索 (BFS) 或深度优先搜索 (DFS) 等方法浏览图,并检查遍历过程中经过的距离处的节点数。DFS 方法特别使用深度优先搜索来浏览图并维护删除计数器。它逐步计算经过的距离处的节点数并返回最终比值。本文还为这两种方法提供了算法说明和 C 语言代码示例。


相关文章