java - 维护数据结构以在 ArrayList 的链接上具有值

标签 java graph adjacency-list

这是我的问题。我有 Vertex 对象的 HashMap(将城市名称映射到相应的对象。

我需要制作一个图表来模拟这些城市之间的路线。

我当前的实现有一个 ArrayListEdge 对象,每个对象有两个 Vertex 和一个路径成本。然后,我使用这些 VertexEdge 对象集制作邻接表,即

for (Edge e : edges) {
    ArrayList<Vertex> list = adjList.get(e.v1);
    if (list == null)
        list = new ArrayList<>();
    list.add(e.v2);
    adjList.put(e.v1, list);
}

edges:  ArrayList of edges having (v1,v2,weight) in each object
list :  The adjacency list for the vertex v1.
adjList: HashMap which has all the lists index by the vertex.

但是在这个模型中,我的邻接表不存储邻接表中的边长,所以每次我想要边长时,我都必须遍历列出并找到其中包含两个顶点的对象。

我想弄清楚是否有一种干净的方法可以将边长包含在此邻接表本身中。

因为我的 Vertex 对象每个顶点只创建一次,所以我不能在其中存储,因为在其中存储 1 个边长会覆盖进入其中的所有其他边。

最佳答案

由于 Edge 对象有两个标记为 v1v2 的顶点,我假设该图是有向的(边从顶点 指向code>v1 到顶点 v2).

也就是说,您可以将 Edge 本身存储在邻接表中。您始终知道目标顶点是 v2,因此稍后在代码中处理列表没有问题:

for (Edge e : edges) {
    ArrayList<Edge> list = adjList.get(e.v1);
    if (list == null)
        list = new ArrayList<>();
    list.add(e);  // add the edge which contains the adjacent vertex and the weight
    adjList.put(e.v1, list);
}

关于java - 维护数据结构以在 ArrayList 的链接上具有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39497759/

相关文章:

java - 查找递归 void 方法的基本情况

java - 如何在Eclipse IDE中的目标文件夹中进行搜索

java - 为什么 HashMap 获取的参数是 Object 而不是键的类型?

java - 如何循环遍历图形的顶点,而不是为每个顶点使用单独的 add.vertex ?

python - 将格子转化为图?

java - 使用空间 O(边数)的图形表示的邻接列表

java - 不兼容的泛型返回类型

html - 居中对齐表格中的绝对文本

java - 表示邻接矩阵/列表

c - c 中的邻接表图实现(任何库)