【问题标题】:adjacency list error with list邻接表错误与列表
【发布时间】:2016-04-24 18:57:20
【问题描述】:

基本上我生成了一个 adj_matrix,我想从 adj_matrix 中创建一个 adj_list...但是我一直收到一个错误消息,说“与呼叫不匹配...” 我在没有 aPair 的情况下尝试了它我仍然得到同样的错误我似乎无法弄清楚我的问题是什么。谁能告诉我为什么列表不起作用?列表在代码的最后

int **gen_random_graph(int n)
{
    srand(time(0));
    int **adj_matrix = new int*[n];
     for(int i = 0; i < n; i++)
     {
        for (int j = i; j < n; j++)   //generating a N x N matrix  based on the # of vertex input
        {
            adj_matrix[i] = new int[n];
        }
     }

    for(int u = 0; u < n; u++)
    {
        for (int v = u; v < n; v++)
        {
            bool edgeOrNot = rand() % 2;   //decide whether it has an edge or not
            adj_matrix[u][v] = adj_matrix[v][u] = edgeOrNot;
            if(adj_matrix[u][v] == true)
            {
                adj_matrix[v][u] = true;
                if(u == v)                            //We can't have i = j in an undirected graph so we set it to false
                {
                    adj_matrix[u][v] = -1;
                }
            }
            else                                        //if adj_matrix[u][v] is false set the symmetry to be false
            {
                adj_matrix[v][u] = adj_matrix[u][v] = -1;
            }
        }

    }
    for(int i = 0; i < n; i++)
    {
        for(int j = i; j < n; j++)           //create the N x N with edges and sets the weight between the edge randomly
        {
            if(adj_matrix[i][j] == true)
            {
                    int weight = rand() % 10 + 1;
                    adj_matrix[i][j] = adj_matrix[j][i] = weight;
                    cout << " ( " << i << "," << j << " ) " << "weight: " << adj_matrix[i][j] << endl;
            }
        }
    }



 for(int i = 0; i < n; i++)
{
    vector<int> adj_list;
    for(int j = i; j < n; j++)
    {
        if(adj_matrix[i][j] > 0)
        {
           int weight = adj_matrix[i][j];
           adj_list.push_back(j);
           cout << adj_list[i] <<  " " << endl;
        }
    }
}
    print(n,adj_matrix);
    return (adj_matrix);
}

【问题讨论】:

  • 可以调用adj_list吗?
  • 嗯,我没有为 adj_list 创建函数,所以不,我认为它不能被调用。基本上我生成了一个 adj_matrix,现在我必须从 adj 矩阵创建 adj_list
  • hmmmm 但我只需要来自 adj_matrix[i][j] 的权重有没有办法解决这个问题?
  • 请提供完整的错误信息。

标签: c++ adjacency-list


【解决方案1】:

我看到 adj_list 是不可调用的,所以你的代码坏了。有几个简单的解决方案。查看these docs,您可以简单地访问listObj.front()listObj.back(),或者您也可以使用listObj.begin() 创建一个迭代器并迭代这两个元素(如果您决定放置更多元素,这可能是可取的比列表中的两个元素)。有关为列表创建迭代器的简单示例,请参阅this tutorial,在摘要上方的代码 sn-p 中。

注意,在这里,为了简单/抽象起见,我称之为listObj 的列表对象在底部循环中将只是adj_matrix[i][j]。这应该可以解决您的语法错误。

此外,除了代码的语法之外,我不明白您为什么要尝试将权重推送到列表中,然后您要打印并返回邻接矩阵。当您似乎只想将整数权重推到它上面时,我也不明白为什么要使用对对象列表。为此,您可以使用简单的整数向量(即:vector &lt;int&gt; adj_list;)...或者更简单,您可以使用简单的整数数组...而不是使用对列表的向量。

编辑:在本地运行代码并查看值后,我意识到问题是 OP 输出中的错误只是他在 C++ 中使用“true”代替整数,这会造成错误,如this SO post 中所述。 OP 还需要在涉及邻接列表时做出进一步的设计决策。更多关于邻接列表的概念,请参见 on Wikipedia

【讨论】:

  • o 假设为 (j, weight) 我只是在测试它是否接受 1 个整数而不是 2 但没有成功
  • 哦,你想明白了吗?看起来它应该相当简单。但请告诉我进展如何。
  • 不,我真的想不通,当我使用矢量 时它一直给我同样的错误,但这次它崩溃了
  • 好的,很高兴知道它崩溃了。让我们看看发生了什么。您正在使用一个 int**,并且您正在为每个条目分配空间,方法是在循环外使用 new 一次,然后在双循环的内部循环内使用一次......你确定你正在初始化你的记忆正确吗?
  • 另外,你有 gdb 或 valgrind 吗?这些是调试代码的有用工具,尤其是当它崩溃并且您想查看回溯时,或者如果您不想使用打印语句来查看循环内的数据值等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多