我想获得一些有关存储图的邻接表的反馈。
我通常使用向量的向量来表示相邻列表,例如std::vector<std::vector<int>> adj_list
对于边E =(u,v),仅使用adj_list[u].push_back(v)
进行存储。如果要删除此边缘,只需执行
it = std::find(adj_list[u_idx].begin(), adj_list[u_idx].end(), v);
adj_list[u_idx].erase(it);
我还需要一个数据结构来存储对应于边缘的权重。因此,最初,我在考虑制作向量std::vector<std::vector<double>> weights
的另一个向量,但这似乎不是最有效的解决方案。就像上面一样,在权重中添加新元素很简单。我要做的就是weights[u].push_back(weight_to_add)
。但是从权重中删除权重似乎比我上面做的事情困难一点,即找到迭代器,然后使用该迭代器执行删除。我可以在adj_list
中找到与迭代器相对应的索引,然后从权重中删除该索引,但是我不知道这是否是解决此问题的最佳方法。
因此,我没有用两个变量来表示邻接列表和权重,而是想制作一个存储邻接列表和权重的3D向量。向量向量的向量。最后一个尺寸是大小2,它存储节点ID v和边缘的相应权重。因此,实际上,它可能只是数组向量的向量。类似于vector<vector<array<...>>>
。但是这里的问题是v是int
并且权重是两倍,所以很明显我不能在这里使用数组。我可以将两者封装在一个结构中,然后执行类似vector<vector<my_struct>>
的操作。也许像vector<vector<pair<int,double>>>
这样的东西会更好?
有关如何解决此问题的任何建议?
答案 0 :(得分:1)
使用
std::vector<std::vector<Entry>> adj_list
正在输入
typedef struct {
int node;
double weight;
bool operator == (const int e) const
{
return (node == e);
}
} Entry;
答案 1 :(得分:0)
是的,您可以使用向量对的邻接列表来执行相同操作
vector< pair<int, int> > adj[V];
void printGraph(vector<pair<int,int> > adj[], int V)
{
int v, w;
for (int u = 0; u < V; u++)
{
cout << "Node " << u << " makes an edge with \n";
for (auto it = adj[u].begin(); it!=adj[u].end(); it++)
{
v = it->first;
w = it->second;
cout << "\tNode " << v << " with edge weight ="
<< w << "\n";
}
cout << "\n";
}
}