【发布时间】:2012-12-31 19:54:13
【问题描述】:
我目前使用的向量如下:
typedef pair<int, int> vertex;
vector < vector<vertex> > adj_list(n); // n is number of vertices
// Input graph
for (int i = 0; i < edges; i++ )
{
cin >> source >> target >> weight;
vertex v(target, weight);
adj_list[source].push_back(v);
}
是列表的向量,即。
vector < list<vertex> > adj_list(n);
更好的选择?如果是,为什么?我主要关心的是有效地创建邻接列表,并能够快速读取连接到特定顶点的所有顶点,以实现 Dijkstra 算法。
【问题讨论】:
-
一次性分配是个好主意。所以这更好:
vector< vector<vertex>> adj_list(n, vector<vertex>(edges)); -
vector<vector<vertex>>可能是最好的,但唯一确定的方法是使用不同的选项对您的应用程序进行基准测试。 -
@Nawaz:查看代码
edges是图中边的总数。您不希望与顶点关联的每个列表都那么大。 -
Dijsktra 的算法需要优先级队列,而不是列表。 (我相信这就是发明斐波那契堆的原因......)您可以使用
std::priority_queue来获得合理的性能,或者推出自己的斐波那契堆实现