按顶点标签对图形进行分区

时间:2016-07-23 03:42:59

标签: algorithm graph graph-algorithm

我正在研究一个需要将定向标记图分割成几个子图的问题。在每个子图中,节点是连接的并且它们具有相同的标签。有没有一种有效的算法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

这是我用Java实现的解决方案,它使用JGraphT作为图形库。

private Set<Set<Node>> partition(DirectedGraph<Node, Edge> graph) {
    Map<Node, Set<Node>> map = new HashMap<Node, Set<Node>>();
    for (Edge edge : graph.edgeSet()) {
        Node source = graph.getEdgeSource(edge);
        Node target = graph.getEdgeTarget(edge);
        if (source.getLabel().equals(target.getLabel())) {
            if (map.get(source) != null && map.get(target) == null) {
                map.get(source).add(target);
                map.put(target, map.get(source));
            } else if (map.get(target) != null && map.get(source) == null) {
                map.get(target).add(source);
                map.put(source, map.get(target));
            } else if (map.get(source) == null && map.get(target) == null) {
                Set<Node> set = new HashSet<Node>();
                set.add(source);
                set.add(target);
                map.put(source, set);
                map.put(target, set);
            } else {
                Set<Node> sourceSet = map.get(source);
                Set<Node> targetSet = map.get(target);
                sourceSet.addAll(targetSet);
                for(Node n : targetSet){
                    map.put(n,sourceSet);
                }
                targetSet = null;
            }
        } else {
            if (map.get(source) == null) {
                Set<Node> set = new HashSet<Node>();
                set.add(source);
                map.put(source, set);
            }
            if (map.get(target) == null) {
                Set<Node> set = new HashSet<Node>();
                set.add(target);
                map.put(target, set);
            }
        }
        Collection<Set<Node>> values = map.values();
    }
    return new HashSet<Set<Node>>(map.values());
}