C ++:是一个图形ADT,应该有一个顶点列表和一个边缘列表或只是顶点与指向其他顶点的指针?

时间:2013-10-04 15:43:38

标签: c++ graph adt vertices edges

我正在尝试用C ++实现一个图形,我不确定是否有一种'正确'的方法来解决这个问题。如果我的每个顶点都包含它指向的顶点列表,或者图形对象是否应包含顶点列表和边缘列表。

2 个答案:

答案 0 :(得分:1)

这取决于您正在处理的图表类型, 如果您的图表是加权的,那么您不能只有一个指针列表,因为您将无法为此连接分配权重。 在这种情况下,我建议每个节点都包含一个连接到它的边的列表。如果图形不是定向的,则对于任何顶点i和j,你可以保存指向同一边{i,j}的指针,如果它是定向的那么边{i,j}和{j,i}是两个不同的对象

另一种方法是保存表示所有顶点之间连接的NxN矩阵。如果图形未加权,则如果在顶点i到顶点j之间存在边缘,则每个单元[i,j]将具有1。如果图形是加权的,那么单元格[i,j]将包含顶点i到顶点j之间的距离,如果边缘不存在则包含无穷大或-1。

如果您的图表已完成(每个顶点都连接到所有其他顶点),我强烈建议您使用矩阵技术,因为它非常易于实现,可让您直接访问任何相关值,并且不会额外的内存或运行时间(例如,当你想迭代连接到某个顶点的所有边时),因为任何顶点都会包含一个到所有其他顶点的连接列表。

答案 1 :(得分:0)

这取决于您访问图表数据。您可以按如下方式定义两个维度向量:

vector< vector<int> > nodes;

其中节点id为0到number_of_nodes -1; 节点6将存储在节点[6]中,并且存储在子节点上。