BFS使用deque

时间:2015-12-07 06:25:47

标签: c++ deque breadth-first-search

确实无法弄清楚如何修复我的代码。我知道有明显的错误,因为它没有运行,但我不确定它们到底是什么,或者如何去修复它们。任何帮助/见解将非常感激。谢谢!!

struct vertices
{
    int value;
    int parent;
    int visited;
    int distance;
};


int BFS(vertices *v, int **adj_matrix, int num_nodes)
{
    int target;
    int cur_v = 0;
    bool found = false;
    int steps = 0;
    cin >> target >> num_nodes;
    adj_matrix [num_nodes][num_nodes];
    deque<int> q;

    for(int i = 0; i < num_nodes; i++)
    {
        v[i].visited = 0;
        v[i].distance = INFINITY;
        v[i].parent = 0;

        v[1].visited = 1;
        v[i].distance = 0;
        q.push_front(v[1].value);

        while(!q.empty())
        {
            cur_v = q.front();
            q.pop_back();
            v[cur_v].visited = 1;
            for(int n=0; n< num_nodes; n++)
            {
                if(adj_matrix[cur_v][i] == n)
                {
                    if(v[n].visited == 0)
                    {
                        v[n].visited = 1;
                        v[n].distance = ((v[cur_v].distance)+1);
                        v[n].parent = cur_v;
                        q.push_front(v[n].value);
                        steps ++;
                    }
                } 
            }
        }
    }
    return steps;
}

int main()
{
    int target;
    int num_nodes;

    cin >> target;
    cin >> num_nodes;

    vertices *v = new vertices[num_nodes];

    int **adj_matrix [num_nodes][num_nodes];

    for(int i=0; i < num_nodes; ++i)
    {
        int node;
        int value;
        cin >> node >> value;

        int num_edges;
        cin >> num_edges;

        for(int j=0; j<num_edges;++j)
        {
            int other_node;
            cin >> other_node;

            **adj_matrix[node][other_node] = 1;
            **adj_matrix[other_node][node] = 1;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

第一个明显的错误是你使用了错误的数据     结构体。当你实现像matrix这样的已知概念时,     BFS,你需要花费大量的时间来思考如何     实现输入,输出,算法的数据结构。

有些人喜欢使用std::vector<std::vector<int>>作为矩阵。我几乎总是使用std::vector<int>来表示矩阵数据。

第二个错误是您变异算法。那件事不是BFS。起初并不明显。

  • 在BFS实现中调用BFS的多个实例。使用相同的输入顶点,其元素正在被修改。在下一个循环中,你不会以干净的状态开始。
  • 展平算法,删除抽象。如果您现在必须使用附属列表怎么办?你必须修改整个事情。

第三个明显的错误是编码风格。你没有做这么糟糕的工作,因为顶点结构是自我解释的

  • 我必须突出显示cur_v的所有实例,以确认它代表 当前顶点
  • 使用n作为计数器并不是一个好主意。
  • 在算法实现中输入输入是一个很大的诺力。