0

我正在使用 OGDF 版本 2012.07。

我有一个 GraphCopy 代表 Graph 实例的副本。在对图副本进行操作时,它保存对原始节点和边的引用。在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;
}

在第二个断言中,原始图中边eOrig的关联边副本的数量必须为零,这仅在删除边副本时才有可能,因为最初(当使用原始图初始化 GraphCopy 时)所有图副本中的边与原始图中对应的原始边相关联;因此,m_eCopy[eOrig].empty()对于所有边都是错误的。

我应该如何在不更改原始图形的情况下复制图形副本中的边

4

1 回答 1

1

我无法理解您对实施的解释。当我在 OGDF 网站上浏览源代码GraphCopy.h时(上面写着 2012.07.),我看到了完全不同的类。有一个类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;
}

但是还有一个问题。GraphCopySimple没有构造函数的实现,所以我猜它是抽象基类,所以你需要派生自己的 GraphCopy 类并实现缺失的函数。

于 2012-08-09T15:12:54.290 回答