在有向图中有效表示邻接表和权重

时间:2018-12-02 01:44:48

标签: c++ graph adjacency-list

我想获得一些有关存储图的邻接表的反馈。

我通常使用向量的向量来表示相邻列表,例如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>>>这样的东西会更好?

有关如何解决此问题的任何建议?

2 个答案:

答案 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"; 
    } 
}