2012-03-19 22 views
-2

私はDijkstraアルゴリズムを実装したいし、キューに頂点を保存する必要があります。C++の頂点のキュー

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

int main() 
{ 

priority_queue<int> mypq;//I want to put a pointer to vertex instead of int 

mypq.push(10);//Here I want to push vertex 
mypq.push(20); 
mypq.push(15); 

cout << "mypq.top() is now " << mypq.top() << endl; 

return 0; 
} 

コメントセクションをお読みください。

+0

C++で構造体を作成する方法を尋ねていますか? – pezcode

+2

あなたはC++の本が大量に必要です。 http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-listを見てください – pmr

+0

キューまたはプライオリティキューが必要ですか? 2つの非常に異なるもの。優先度キューは、通常の意味でのキューではありません。 –

答えて

1

念頭に置いておくべきことは、priority_queueはソートされたコンテナなので、格納されるオブジェクトの比較を定義する必要があります(厳密な弱い順序に従わなければなりません)。

ダイクストラのアルゴリズムについては、各頂点にウェイトがあると仮定し、それらのウェイトで頂点を順序付けしたいとします。

struct vertex { 
    int x, y; 
    unsigned weight; 

    vertex(int x, int y, unsigned weight) : x(x), y(y), weight(weight) {} 
    bool operator <(vertex &other) { return weight < other.weight; } 
}; 

今頂点オブジェクトのPRIORITY_QUEUEは非常に簡単です:

std::priority_queue<vertex> vertices; 

vertices.push(vertex(1, 2, 3)); 
vertices.push(vertex(0, 1, 2)); 
vertices.push(vertex(10, 11, 12)); 

std::cout << "Top = " << vertices.top() << "\n"; 

編集:あなたが動作するようにその最後の行の挿入演算子を定義する必要があります - のようなもの:

std::ostream &operator<<(std::ostream &os, vertex const &v) { 
    return os << "(" << v.x << ", " << v.y << '[' v.weight << "])\n"; 
} 
+0

私の質問を理解してくれてありがとう、私の質問に答える時間があります。 –

+0

私は指示どおりにコンパイルしましたが、これらのエラーがあります:http://pastebin.com/raw.php?i=B7vWmqJR ::また、vertices.pushだったはずです。 vertices.push_backではありません。 –

+0

@FewTem:編集された解答を見てください(そして、 'push'と' push_back'についての思い出に感謝します - 残念です)。 –