【问题标题】:C++ Priority Queue implementation to sort graph edgesC++ 优先队列实现对图边进行排序
【发布时间】:2015-03-09 10:42:11
【问题描述】:

我正在尝试对图形边缘进行排序,但无法这样做。 下面给出的是我实现相同的优先级队列。

  class CompareDistance
    {
        public:    
            bool operator()(pair<int,int> n1,pair<int,int> n2)
            {
                if(g[n1.first][n2.second] < g[n2.first][n2.second])
                return true;
                else
                return false;
           }
    };
    int g[3][3] = {{4,1,3},{3,3,3},{3,3,3}};//graph edges


int main()
{

    priority_queue<pair<int,int>,vector<pair<int,int> >,CompareDistance> pq;


    for(int i = 0 ; i < 3 ; i++)
        for(int j = 0 ; j < 3 ; j++)
            pq.push(pair<int,int>(i,j));

    cout<<"\t"<<g[pq.top().first][pq.top().second];//does not give the correct result
    pq.pop();




    getch();
}

【问题讨论】:

  • 请说明你的目标是什么,并提出一个问题...
  • 为了更好地理解,我对其进行了编辑,我希望优先级队列在图中包含按距离排序的节点值对-@WojciechFrohmberg
  • @HARJATINSINGH 您是否有充分的理由尝试将它们全部放入 PQ 中,而不是简单地制作一个向量并对其进行排序?

标签: c++ graph stl priority-queue


【解决方案1】:

好的,如果我理解正确,你有一个有向图(例如三个节点的完整图)。每个弧都有相关的值——权重,您需要按此值对弧的集合进行排序。 首先,您可能应该创建弧的集合。我不认为 priority_queue 是您最好的选择。因为简单,我会在这里使用向量:

std::vector<std::pair<int, std::pair<int, int>>> arcs;

第一对将包含弧权重和弧存在的节点的有向对。 接下来,添加所有节点后,您只需对指定自定义函数的集合进行排序以进行比较。如果你使用 c++11,它可能如下所示:

std::sort(arcs.begin(), arcs.end(), 
          [] (const std::pair<int, std::pair<int, int>>& a,
              const std::pair<int, std::pair<int, int>>& b) { 
                  return a.first < b.first; 
              });

【讨论】:

  • 如果您想在线修改弧线的排序集合,您可以考虑使用 std::multiset。
  • 这是我想要的解决方案,但如果不是结构,可能更喜欢带有 3 个字段的 std::tuple 弧,即使嵌套的 std::pairs 非常不切实际并且可能变得困难了解何时必须编写诸如 a.second.firsta.second.second 之类的代码。犯逻辑错误变得越来越容易。
【解决方案2】:

您的代码无法编译,但很容易解决。我假设 g 包含边缘权重。这里有一个错误:

if(g[n1.first][n2.second] < g[n2.first][n2.second])

应该是

if(g[n1.first][n1.second] < g[n2.first][n2.second])

注意左边第二个索引的名称。 Live On Coliru

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多