1

私はLEMON Graphライブラリを使用していますが、対応する値を介してListDigraph::Node xを受け取る効率的な方法があるかどうか疑問に思っていましたListDigraph::NodeMapか?

私は次のようなことを考えていました:

lemon::ListDigraph lg;
lemon::ListDigraph::NodeMap<std::string> nodeColor(lg);

lemon::ListDigraph::Node n = lg.addNode();
nodeColor[n] = "red";

lemon::ListDigraph::Node m = lg.addNode();
nodeColor[m] = "green";

# now I'd like to have something like:
lemon::ListDigraph::Node x = nodeColor.getNodeFromColor("red");

このようなものはすでにレモンに存在しますか?マップを自作するしか方法がない場合、キー(ノード)を返すにはどうすればよいですか? マップの基になる値を反復処理できますか?

4

2 に答える 2

0

私の知る限り、箱から出してすぐにレモンではそれは不可能です. 特に、NodeMapは必ずしも 1 対 1 ではないためです。すべてのノードに値「赤」を与えることを妨げるものは何もないため、逆方向のクエリでは一意の正しい結果が得られません。

また、 a の内容を直接反復することもできませんNodeMap。ただし、グラフ内のすべてのノードを反復処理して、対応する値を求めることができます。

for (lemon::ListDigraph::NodeIt n(lg); n != lemon::INVALID; ++n) {
    if (nodeColor[n] == "red) {
        // do something
    }
}

または、前述のように、独自のマップを定義できます。

#include <unordered_map>

lemon::ListDigraph lg;
lemon::ListDigraph::NodeMap<std::string> nodeColor(lg);
std::unordered_map<std::string, lemon::ListDigraph::Node> color2node;

lemon::ListDigraph::Node n = lg.addNode();
nodeColor[n] = "red";
color2node.emplace("red", n);

lemon::ListDigraph::Node m = lg.addNode();
nodeColor[m] = "green";
color2node.emplace("green", m);

lemon::ListDigraph::Node x = node2color.at("red");
于 2018-04-13T15:36:23.560 に答える
0

残念ながら、Lemon's からキーセット (またはそれぞれのノード) を取得することはできません。 NodeMap リファレンスNodeMapを参照してください。

マップを反復処理する方法もありません。これを克服する最善の方法は、自分で作成するように独自のマップを作成するか、追加のヘルパー マップ (または同様のコンテナー) を使用することです。

于 2018-03-13T11:09:31.573 に答える