zoukankan      html  css  js  c++  java
  • java实现判断图的连通性

    图的连通性的概念:

    连通无向图:如果无向图任意两个顶点都连通,则称为连通无向图
    连通有向图:如果有向图任意两个顶点vi,vj,从vi到vj和从vj到vi都有路径,则称有向图是强连通有向图

    public class Connect {
    
        public static void main(String[] args) {
            Set<String> nodes = ImmutableSet.of("A", "B", "C", "D");
            List<String> hop = Lists.newArrayList("C->A", "C->D");
            List<Pair<String, String>> objects = Lists.newArrayList();
            for (String s : hop) {
                String[] split = s.split("->");
                String from = split[0];
                String to = split[1];
                Pair<String, String> pair = new Pair<>(from, to);
                objects.add(pair);
            }
            Boolean isConnect = unDirectGraphConnect(nodes,objects);
            System.out.println("无向图连通性");
            System.out.println(isConnect);
            System.out.println("有向图连通性");
            Boolean isConnect2 = directGraphConnect(nodes, objects);
            System.out.println(isConnect2);
        }
    
        /**
         * 连通无向图判断,最后应该只有一个连通分量,而且可以连通所有节点
         *
         * @param pairList
         * @return
         */
        public static Boolean unDirectGraphConnect(Set<String> nodes, List<Pair<String, String>> pairList) {
            Multimap<String, String> map = HashMultimap.create();
    
            for (Pair<String, String> pair : pairList) {
                String from = pair.getFrom();
                String to = pair.getTo();
                //默认from、to都不存在
                boolean fromPresent = false;
                boolean toPresent = false;
                if (isPresent(map, from)) {
                    fromPresent = true;
                }
                if (isPresent(map, to)) {
                    toPresent = true;
                }
                //from/to都不存在,最简单,from做key,将from和to放value里
                if (!fromPresent && !toPresent) {
                    map.put(from, from);
                    map.put(from, to);
                    //from存在,to不存在,要区分from是key还是value
                } else if (!toPresent) {
                    boolean inKey = map.containsKey(from);
                    if (inKey) {
                        map.put(from, to);
                    } else {
                        String valKey = getKeyByValue(map, from);
                        map.put(valKey, to);
                    }
                    //to存在,from不存在,也要区分to是key还是value
                } else if (!fromPresent) {
                    boolean toInKey = map.containsKey(to);
                    if (toInKey) {
                        map.put(to, from);
                    } else {
                        String valKey = getKeyByValue(map, to);
                        map.put(valKey, from);
                    }
                }
                //剩下最后一种可能,from/to都存在,那就不需要处理了
            }
            System.out.println(map);
            //只有一个连通分量,且能连通所有节点
            return map.keySet().size() == 1 && map.values().containsAll(nodes);
    
        }
    
        /**
         * 有向图连通性判断
         * 理论上有多少顶点就有多少key,且value都等于顶点数
         *
         * @param pairList
         * @return
         */
        public static Boolean directGraphConnect(Set<String> nodes, List<Pair<String, String>> pairList) {
            Multimap<String, String> map = HashMultimap.create();
            //对map初始化
            for (String node : nodes) {
                map.put(node, node);
            }
    
            for (Pair<String, String> pair : pairList) {
                String from = pair.getFrom();
                String to = pair.getTo();
    
                Collection<String> values = map.get(from);
                //把to加入from连通map
                if (!values.contains(to)) {
                    map.put(from, to);
                }
                //所有之前能到from的,现在也能到to了
                for (String key : map.keySet()) {
                    Collection<String> values2 = map.get(key);
                    if (values2.contains(from) && !values2.contains(to)) {
                        values2.add(to);
                    }
                }
                //所有之前to能到的,现在from也能到了
                Collection<String> value5 = map.get(to);
                for (String s : value5) {
                    if (!map.get(from).contains(s)) {
                        map.put(from, s);
                    }
                }
    
    
            }
            boolean connect = true;
            int nodeSize = nodes.size();
            for (String key : map.keySet()) {
                Collection<String> values3 = map.get(key);
                if (values3.size() != nodeSize) {
                    connect = false;
                }
            }
            System.out.println(map);
            return connect;
    
        }
    }
  • 相关阅读:
    HDU 4005 The war
    #undef
    [转载] #define new DEBUG_NEW
    [转载]常用正则表达式
    [百科]
    [转载]
    [转载]
    [转载]
    [百科]
    [转载]VC6中的文件后缀
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15359860.html
Copyright © 2011-2022 走看看