在C ++中使用STL表示多图的最佳数据结构是什么?

时间:2018-11-21 18:48:08

标签: c++ data-structures graph

我正在寻找某种数据结构以C ++存储多图,但我想尽可能多地利用STL。目前,我正在使用类似于单独的链式哈希表的std::map<int,std::vector<int>>。映射的关键点是顶点,值是std::vector<int>,其中包含与关键点形成边缘的所有不同顶点。

我主要对O(1)查找感兴趣,以查看一个顶点是否与另一个顶点共享一条边。由于这是未加权的多重图,因此顶点可以与另一个顶点共享多个边。

保证该图具有欧拉回路和哈密尔顿回路,但是我不确定这是否相关。

你们是否建议使用STL比std::map<int,std::vector<int>>更好的数据结构?

1 个答案:

答案 0 :(得分:0)

如果顶点的数量N小,则使用邻接矩阵graph[u][v]可能是最容易的,其中u是从vvector<vector<int>> graph的边数。

如果顶点号的范围都从0到N​​-1,或者从1到N,或者相似,则可以将其简化为int graph[][],或者如果在编译时已知N,甚至可以简化为unordered_map<int, unordered_set<int>> graph

如果N大,并且图形稀疏(如M≈N所示),则最好为每个顶点使用一个集合:vector<unordered_set<int>> graphgraph[u],其中{ {1}}是所有顶点v的集合,其顶点从uv

请注意,我正在使用unordered_mapunordered_set集合,它们平均提供O(1)访问。在最坏的情况下,与任何基于散列的容器一样,它们的性能在地图或集合的大小上是线性的。

如果您不想处理所有这一切并希望使用现成的解决方案,请考虑使用Boost Graph Library,NGraph,LEMON或Google OR-Tools。