【问题标题】:adjacency list of a directed weighted graph有向加权图的邻接表
【发布时间】:2010-01-02 00:59:16
【问题描述】:

我正在使用邻接表来表示有向加权图,并基于this SO question 提供的示例代码,我创建了以下内容:

import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;

public class _Graph {
    private Map<String, LinkedHashSet<HashMap<String, Integer>>> map = new HashMap<String, LinkedHashSet<HashMap<String, Integer>>>();

    public void addEdge(String node1, String node2, int dist) {
        LinkedHashSet<HashMap<String, Integer>> adjacent = map.get(node1);
        HashMap<String, Integer> innerMap = new HashMap<String, Integer>();
        if(adjacent==null) {
            adjacent = new LinkedHashSet<HashMap<String, Integer>>();                       
            map.put(node1, adjacent);
        }
        innerMap.put(node2, dist);
        adjacent.add(innerMap);
    }

    public boolean isConnected(String node1, String node2) {
        Set<HashMap<String, Integer>> adjacent = map.get(node1);
        if(adjacent==null) {
            return false;
        }
        return adjacent.contains(node2);
    }

    public LinkedList<HashMap<String, Integer>> adjacentNodes(String node) {
        LinkedHashSet<HashMap<String, Integer>> adjacent = map.get(node);
        if(adjacent==null) {
            return new LinkedList<HashMap<String, Integer>>();
        }
        return new LinkedList<HashMap<String, Integer>>(adjacent);
    }

}

我无法使isConnected 方法正常工作。我是否使用了错误的数据结构来表示此处的图表(Map&lt;String, LinkedHashSet&lt;HashMap&lt;String, Integer&gt;&gt;&gt;)? hashmap 将保存连接节点的名称和到它的距离:

Map<startNode, LinkedHashSet<HashMap<endNode, distanceToEndNode>>>
  1. 基本上如何检查一个节点 属于a的邻接表 给定基节点?我认为问题 被简化为正确迭代 在adjacent Set&lt;HashMap&lt;String, Integer&gt;&gt; 结构,还是我的推理有误?
  2. 在我的第二种方法中 adjacentNodes(String node)我是 返回一个包含的链表 的地图(在一个集合结构中) 连接的节点及其距离。如何有效地迭代以查看任何给定节点的所有连接?

【问题讨论】:

    标签: java collections adjacency-list


    【解决方案1】:

    我认为这里不需要LinkedHashSet,您可以只用Map&lt;String, Map&lt;String, Integer&gt;&gt; 来表示图形。

    isConnected 基本上是你已经拥有的:

    public boolean isConnected(String node1, String node2) {
        Map<String, Integer> adjacent = map.get(node1);
        if(adjacent==null) {
            return false;
        }
        return adjacent.containsKey(node2);
    }
    

    adjacentNodes只需要为源节点拉出哈希集中的条目

    public Collection<Map.Entry<String, Integer>> adjacentNodes(String node) {
        Map<String, Integer> adjacent = map.get(node);
        if(adjacent==null) {
            return new ArrayList<Map.Entry<String, Integer>>();
        }
        return adjacent.entrySet();
    }
    

    【讨论】:

    • 谢谢,我应该更改相邻.contains(node2);到相邻的.containsKey(node2);
    • 在这两个函数中初始化 Map 都会出错:“类型不匹配:无法从 LinkedHashSet> 转换为 Map”
    • @user782400:我是说你不想使用LinkedHashSet。 map 应该具有类型 Map&lt;String,Map&lt;String,Integer&gt;&gt;。在构建过程中,您可能希望将HashMap 用于您的Maps。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2015-12-17
    • 2012-07-11
    相关资源
    最近更新 更多