可从图中所有其他节点访问的节点数

data structurec++programming

可从图中任何特定节点访问的节点数称为可从图中所有其他节点访问的节点数。它显示了图内的可达性和连通性程度。我们从每个节点开始,调查通往其他节点的所有可访问路线,以获得此计数。我们可以访问的节点会在我们穿过图时记录下来。图中可到达节点的数量包括所有可以到达的节点。这对于理解网络关系和信息流效率至关重要。

使用的方法

  • 可达性矩阵

  • 连通分量

可达性矩阵

图中的可达节点使用可达性矩阵(一个方阵)进行计数。矩阵的 [i][j] 项分别表示是否可以从节点 i 到达节点 j。通过检查矩阵的行可以揭示从网络中的每个节点可以到达的节点。每行中的"1"的数量表示可以从给定节点到达的节点数,提供有关图的一般连通性和可达性的信息。该矩阵有助于理解图中节点之间的连通性和关系,因为它提供了有关节点在图中可访问性的有用见解。

算法

  • 将 n 视为图 G 中的节点总数。

  • 制作一个名为 ReachabilityMatrix 的二维数组,其大小为 n x n,初始值为零。

  • 从 0 到 n-1,对于每个节点 i:

    从节点 i 开始深度优先搜索 (DFS) 或广度优先搜索 (BFS)。

    将 ReachabilityMatrix 的值设为 1,并将从节点 i 可访问的所有节点标记为已访问。

  • 在 ReachabilityMatrix 中,有四行。

    计算行中的"1",并将总数添加到 count[] 数组中的适当位置。

  • 给我数组 count[]。

示例

#include <iostream>
#include <vector>
using namespace std;

void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {
    visited[node] = true;
    for (int neighbor : graph[node]) {
        if (!visited[neighbor]) {
            dfs(neighbor, graph, visited);
        }
    }
}

int main() {
    int N = 5; 
    vector<vector<int>> graph(N);

    graph[0].push_back(1);
    graph[1].push_back(2);
    graph[0].push_back(2);
    graph[2].push_back(3);
    graph[3].push_back(4);
    graph[2].push_back(4);

    vector<vector<bool>> reachabilityMatrix(N, vector<bool> (N, false));
    for (int i = 0; i < N; ++i) {
        vector<bool> visited(N, false);
        dfs(i, graph, visited);
        reachabilityMatrix[i] = visited;
    }

    for (int i = 0; i < N; ++i) {
        int count = 0;
        for (int j = 0; j < N; ++j) {
            if (reachabilityMatrix[i][j]) {
                count++;
            }
        }
        cout << "Vertex " << i << " can reach " << count << " nodes." << endl;
    }

    return 0;
}

输出

Vertex 0 can reach 5 nodes.
Vertex 1 can reach 4 nodes.
Vertex 2 can reach 3 nodes.
Vertex 3 can reach 2 nodes.
Vertex 4 can reach 1 nodes.

连通分量

在"从图中所有其他节点可访问的节点数"的上下文中,连通分量是通过直接或间接边连接并允许彼此通信的节点集合。我们识别这些相关分量是为了计算可从其他每个节点访问的节点数。在同一个分量内,节点可以相互通信。计算每个组件的大小有助于我们更好地理解整个图中信息流的连通性和效率,因为它揭示了特定组件中所有其他节点可到达的节点数。

算法

  • 将图 G 作为邻接表或矩阵作为输入。

  • 创建一个空列表或数组来跟踪每个节点可到达的节点数。

  • 从头开始创建一个集合来记录访问过的节点。

  • 图中的节点总数应该是您创建的变量的初始值。

  • 迭代遍历图中的每个节点:

    初始化一个变量来计算从当前节点可到达的节点数,并将其设置为 1(节点本身)。a.如果当前节点未被访问:i.

    从当前节点开始,进行深度优先搜索 (DFS) 或广度优先搜索 (BFS) 遍历。

    标记已访问节点,并在遍历时增加每个已访问节点的计数。

  • 对于每个节点,增加列表或数组中可用节点的数量。

  • 必须重复步骤 5,直到到达所有节点。

  • 列表或数组现在包含可以从图中每个节点到达的节点数。

  • 最后一步是返回可作为输出运行的相应节点中可用节点数的列表。

示例

#include <iostream>
#include <vector>
using namespace std;

void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {
    visited[node] = true;
    for (int neighbor : graph[node]) {
        if (!visited[neighbor]) {
            dfs(neighbor, graph, visited);
        }
    }
}

int countConnectedComponents(vector<vector<int>>& graph) {
    int N = graph.size();
    vector<bool> visited(N, false);
    int count = 0;
    for (int i = 0; i < N; ++i) {
        if (!visited[i]) {
            dfs(i, graph, visited);
            count++;
        }
    }
    return count;
}

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

    int connectedComponents = countConnectedComponents(graph);
    cout << "连通分量的数量: " << connectedComponents << endl;

    return 0;
}

输出

连通分量的数量: 3

结论

总之,网络内连接和可达性的一个关键指标是图中可从其他每个节点到达的节点数。为了有效地计算这个数量,Floyd-Warshall 算法、可达性矩阵和连通分量是至关重要的工具。为了估计每个节点可访问的节点数,Floyd-Warshall 技术改变了传统技术。图的可达性信息由可达性矩阵表示,使我们能够确定每个节点可访问哪些节点。最后,识别连通分量使计算单个分量内可访问的节点数变得更加容易。了解这个数量对于评估各种网络系统(包括计算机网络、社交网络和交通网络)中信息流的有效性至关重要。


相关文章