此图包含虚拟顶点。如何使用邻接表存储顶点的状态信息?应该为每个顶点存储输出边缘。
我使用了简单的邻接表。但是在这里,例如,v14具有两组不同的出站边缘(一组没有出站边缘,另一组有两个出站边缘)。我应该使用什么数据结构来表示这样的虚拟节点。
答案 0 :(得分:0)
由于您对实现没有任何限制,因此只需一个简单的类即可。在这里,我们在向量中存储(共享)指向子代的指针。 (重载)addChild
方法返回对添加的子项的引用,因此更容易将addChild
链接在一起。使用的操作符重载很不错,但不是必须的,如果需要,可以将其删除。这是代码:
#include <utility>
#include <iostream>
#include <string>
#include <vector>
#include <memory>
using std::vector;
using std::string;
using std::size_t;
using std::shared_ptr;
using std::make_shared;
using std::ostream;
using std::cout;
using std::endl;
class Node {
public:
using child_ptr_type = shared_ptr<Node>;
using contaner_type = vector<child_ptr_type >;
explicit Node(string lab = "Default", contaner_type ch = {})
: label(std::move(lab))
, children(std::move(ch))
{}
const string &getLabel() const
{ return label; }
void setLabel(const string &label)
{ Node::label = label; }
const contaner_type &getChildren() const
{ return children; }
const Node& getChild(size_t indx) const
{ return *children[indx]; }
Node& getChild(size_t indx)
{ return *children[indx]; }
Node& addChild(const string& lab = "Default", const contaner_type & ch = {})
{
children.push_back(make_shared<Node>(lab, ch));
return *children.back();
}
Node& addChild(const child_ptr_type &child)
{
children.push_back(child);
return *children.back();
}
Node& addChild(const Node& node)
{
children.push_back(make_shared<Node>(node));
return *children.back();
}
friend ostream& operator<<(ostream& os, const Node &node)
{
node.print(os);
return os;
}
Node&operator[](size_t indx)
{
return getChild(indx);
}
const Node&operator[](size_t indx) const
{
return getChild(indx);
}
private:
string label;
contaner_type children;
void print(ostream& os, size_t level = 0) const
{
for (size_t i = 0; i != level; ++i) {
os << "|----";
}
os << label << '\n';
for (const auto& child : children) {
child->print(os, level + 1);
}
}
};
int main()
{
Node V1("V1");
V1.addChild("V2").addChild("V5").addChild("V7").addChild("V10");
V1[0].addChild("V6").addChild("V8").addChild("V10");
V1[0][1][0].addChild("V11").addChild("V13");
V1[0][1][0].addChild("V14");
V1.addChild("V3").addChild("V12").addChild("V14").addChild("V6");
V1[1][0][0].addChild("V10");
V1.addChild("V4").addChild("V13").addChild("V8");
cout << V1 << endl;
return 0;
}
图中的示例是main
中的树。输出如下:
V1
|----V2
|----|----V5
|----|----|----V7
|----|----|----|----V10
|----|----V6
|----|----|----V8
|----|----|----|----V10
|----|----|----|----V11
|----|----|----|----|----V13
|----|----|----|----V14
|----V3
|----|----V12
|----|----|----V14
|----|----|----|----V6
|----|----|----|----V10
|----V4
|----|----V13
|----|----|----V8