0

OGDF バージョン 2012.07 を使用しています。

Graph インスタンスのコピーを表す GraphCopy があります。グラフのコピーを操作するときに、元のノードとエッジへの参照を保持します。GraphCopyのドキュメントでは、次のように述べています。

エッジ分割をサポートするグラフのコピー。

クラスGraphCopyは、グラフのコピーを表し、元のグラフのノードとエッジとコピーとの間のマッピングを維持します。

[...]

次のように文書化されているogdf::GraphCopy::newEdge(edge eOrig)メソッドがあります。

元のエッジeOrigで新しいエッジ ( v,w ) を作成します。

メソッドは次のように実装されます。

edge GraphCopy::newEdge(edge eOrig)
{
    OGDF_ASSERT(eOrig != 0 && eOrig->graphOf() == m_pGraph);
    OGDF_ASSERT(m_eCopy[eOrig].empty()); // no support for edge splitting!

    edge e = Graph::newEdge(m_vCopy[eOrig->source()], m_vCopy[eOrig->target()]);
    m_eCopy[m_eOrig[e] = eOrig].pushBack(e);

    return e;
}

2 番目のアサーションでは、元のグラフのエッジeOrigの関連付けられたエッジ コピーの数はゼロでなければなりません。これは、エッジ コピーが削除された場合にのみ可能です。グラフ コピーのエッジは、元のグラフの対応する元のエッジに関連付けられます。したがって、m_eCopy[eOrig].empty()すべてのエッジに対して false です。

元のグラフを変更せずに、グラフのコピーでエッジを複製するにはどうすればよいですか?

4

1 に答える 1

1

実装についての説明を追うことはできません。OGDF Webサイト(2012.07用と記載されています)でソースコードGraphCopy.hを参照すると、まったく異なるクラスが表示されます。1つのクラスGraphCopy(エッジ分割をサポートする派生GraphCopyクラスのインターフェイス)と、エッジ分割をサポートしない別のクラスGraphCopySimpleがあります。

だから私のアドバイスは、あなたが本当に正しいバージョンを持っているかどうかを確認することです。

GraphCopySimpleのメソッドnewEdge(edge eOrig)、次のようになります。

edge newEdge(edge eOrig) {
    OGDF_ASSERT(eOrig != 0 && eOrig->graphOf() == m_pGraph);
    edge e = Graph::newEdge(m_vCopy[eOrig->source()], m_vCopy[eOrig->target()]);
    m_eCopy[m_eOrig[e] = eOrig] = e;
    return e;
}

しかし、1つの問題が残っています。GraphCopySimpleにはコンストラクターの実装がないため、抽象基本クラスを意味していると思います。したがって、独自のGraphCopyクラスを派生させ、不足している関数を実装する必要があります。

于 2012-08-09T15:12:54.290 に答える