我正在使用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()
对所有边都是假的。
如果不更改原始图表,我应该如何在图表副本中复制边缘?
答案 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类并实现缺少的函数。