【问题标题】:DFS using 1D like 2D vectorDFS 使用 1D 类似 2D 向量
【发布时间】:2021-12-18 21:48:36
【问题描述】:

当邻接表是在一维向量中创建时,如何在dfs的for循环中像二维向量一样使用它。

int dfs(int node) {
    int visCount = 1;
    visited[node] = true;
//this part!
    for (auto neighbour: graph[node]) {
        if (!visited[neighbour]) {
            visCount += dfs(neighbour);
        }
    }
    return visCount;
}

【问题讨论】:

  • 您将不得不解释“邻接列表是在一维向量中创建的”的意思。在graph[node] 上面发布的代码中,可能返回对某种邻居容器的引用,这意味着graph 是容器类型的向量或哈希表。如果graph 不是邻接列表的向量,您是否在问如何使其工作?那么你必须告诉我们什么是图表。我的意思是你只是问如何将二维数组表示为一维数组?
  • 是的,如何将二维数组表示为一维数组?
  • 那么你想将图表示为邻接矩阵还是仍然作为邻接“列表”,但每行固定大小并用 0 或其他东西填充邻居少于数量的节点列? ...您的问题未详细说明。

标签: c++ c++11


【解决方案1】:

您可以通过选择行优先或列优先排序并进行数学运算来将二维数组表示为一维数组。例如这是针对主要行的,其中cols 是二维数组中的列数:

int get_1D_index_from_row_col(int row, int col, int cols) {
    return col + row * cols;
}

然后,要使用一维数组表示图形,您需要选择是要使用布尔值的邻接矩阵还是某个最大大小的邻接“列表”。以下是邻接列表版本的示例(因为您发布的代码似乎使用了该版本)。表示为一维数组的二维数组有 5 行和 4 列。 n 行是节点 n 的邻接表。我们允许最多 4 个邻居,并为少于 4 个邻居的节点填充 -1。

#include <iostream>
#include <unordered_set>
#include <functional>

int get_1D_index_from_row_col(int row, int col, int cols) {
    return col + row * cols;
}

void dfs(const std::vector<int>& graph, int num_nodes, int max_neighbors, std::unordered_set<int>& visited, int node, const std::function<void(int)>& visit) {
    if (visited.find(node) != visited.end()) {
        return;
    }
    visit(node);
    visited.insert(node);

    //recurse over neighbors...
    for (int i = 0; i < max_neighbors; ++i) {
        int neighbor = graph[get_1D_index_from_row_col(node, i, max_neighbors)];
        if (neighbor >= 0) {
            dfs(graph, num_nodes, max_neighbors, visited, neighbor, visit);
        } else {
            break;
        }
    }
}

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

    dfs(graph, 5, 4, visited, 0,
        [](int node) {
            std::cout << "visited node " << node << "\n";
        }
    );

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多