在ogdf :: GraphCopy中复制边

时间:2012-08-08 13:43:03

标签: c++ graph

我正在使用OGDF版本2012.07。

我有一个GraphCopy,它代表一个Graph实例的副本。它在图形副本上操作时保留对原始节点和边的引用。在documentation of 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()对所有边都是假的。

如果不更改原始图表,我应该如何在图表副本中复制边缘

1 个答案:

答案 0 :(得分: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类并实现缺少的函数。