我使用的是 OGDF 2012.07 版。
我有一个 GraphCopy,它表示 Graph 实例的拷贝。在对图形拷贝进行操作时,它会保存对原始节点和边的引用。在documentation of GraphCopy ,它说:
Copies of graphs supporting edge splitting.
The class GraphCopy represents a copy of a graph and maintains a mapping between the nodes and edges of the original graph to the copy and vice versa.
[...]
有一个方法ogdf::GraphCopy::newEdge(edge eOrig)记录如下:
Creates a new edge (v,w) with original edge eOrig.
方法实现如下:
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()
对所有边都是假的。
我应该如何在不更改原始图形的情况下复制图形拷贝中的边?
最佳答案
我无法理解您对实现的解释。当我浏览源代码时 GraphCopy.h在 OGDF 网站上(上面写着 2012.07.),我看到了完全不同的类(class)。有一个类 GraphCopy(它是支持边分割的派生 GraphCopy 类的接口(interface))和另一个不支持边分割的类 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 类并实现缺少的函数。
关于c++ - 在 ogdf::GraphCopy 中复制一条边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11865847/