簡體   English   中英

通過頂點標簽對圖形進行分區

[英]Partition a graph by vertex label

我正在解決一個問題,該問題需要將有向標記圖划分為幾個子圖。 在每個子圖中,節點是連接的,並且它們具有相同的標簽。 有解決這個問題的有效算法嗎?

這是我用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());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM