我正在寻找某种数据结构以C ++存储多图,但我想尽可能多地利用STL。目前,我正在使用类似于单独的链式哈希表的std::map<int,std::vector<int>>
。映射的关键点是顶点,值是std::vector<int>
,其中包含与关键点形成边缘的所有不同顶点。
我主要对O(1)查找感兴趣,以查看一个顶点是否与另一个顶点共享一条边。由于这是未加权的多重图,因此顶点可以与另一个顶点共享多个边。
保证该图具有欧拉回路和哈密尔顿回路,但是我不确定这是否相关。
你们是否建议使用STL比std::map<int,std::vector<int>>
更好的数据结构?
答案 0 :(得分:0)
如果顶点的数量N小,则使用邻接矩阵graph[u][v]
可能是最容易的,其中u
是从v
到vector<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>> graph
或graph[u]
,其中{ {1}}是所有顶点v
的集合,其顶点从u
到v
。
请注意,我正在使用unordered_map
和unordered_set
集合,它们平均提供O(1)访问。在最坏的情况下,与任何基于散列的容器一样,它们的性能在地图或集合的大小上是线性的。
如果您不想处理所有这一切并希望使用现成的解决方案,请考虑使用Boost Graph Library,NGraph,LEMON或Google OR-Tools。