起初我是c ++的初学者,我自学它,所以请回答相当简单......
我需要编写一个包含节点的图表,每个节点都有id和边缘列表,每个边缘都有另一个节点id和距离
我正在寻找的是我应该用什么来构建这个图,因为我想使用dijkstra算法将最短路径形成一个点到另一个...所以搜索性能应该是我认为最重要的! !
我搜索了很多,现在我很困惑
提前感谢您的帮助
答案 0 :(得分:11)
您可以定义{/ 1}}结构,如
Edge
并创建一个图表
struct Edge
{
int destination;
int weight;
};
然后,要访问来自顶点vector<vector<Edge> > graph;
的所有边,您可以编写类似
u
您可以动态添加新边,例如从第3个顶点到第7个边的边,权重为8:
for( int i = 0; i < graph[u].size(); ++i ) {
Edge edge = graph[u][i];
// here edge.destination and edge.weight give you some details.
}
等
对于无向图,您当然不应忘记添加对称边。
这应该没问题。
修改强>
基本容器(Edge newEdge;
newEdge.destination = 7;
newEdge.weight = 8;
graph[3].push_back( newEdge );
,std::vector
,std::list
)的选择取决于用例,例如你经常用图表做什么:添加/删除顶点/边,只是遍历。创建图表后,std::map
或std::list
同样适用于Dijkstra,std::vector
由于放松阶段的顺序访问模式而更快一些。
答案 1 :(得分:0)
包含节点的图表,每个节点都有id和边缘列表,每个边缘都有另一个节点id和距离
如果我们将每个节点id视为索引。我们可以如下绘制边的nxn矩阵。
这可以帮助您绘制带边的图形。
[0][1][2][3]
[0] | 1 0 0 0|
[1] | 0 0 1 0|
[2] | 1 0 0 1|
[3] | 0 0 1 0|
因此,2D数组是矩阵的良好表示。
int maxtrix[4][4] = new int[4][4];
答案 2 :(得分:-1)
我个人会使用std::map<Node*, std::set<Node*> >
。这非常有用,因为每次您在一个节点时,您都可以快速找到该节点所连接的节点。如果需要,迭代所有节点也非常容易。如果您需要在边缘放置权重,可以使用std::map<Node*, std::set< std::pair<int, Node*> > >
。这将比使用矢量提供更好的性能,尤其是对于大型图形。