• 无权图的遍历


     
    public class UnweightedGraph {
    
    
        private final List<String> vertexes = new ArrayList<String>();
        private final Map<String, List<String>> linkTable = new TreeMap<String, List<String>>();
    
    
        public List<String> getVertexes() {
            return vertexes;
        }
    
    
        public void addVertexes(String vertex) {
            if (!this.vertexes.contains(vertex.trim())) {
                this.vertexes.add(vertex.trim());
            }
        }
    
    
        public void removeVertexes(String vertex) {
            this.vertexes.remove(vertex.trim());
            linkTable.remove(vertex.trim());
            for (Map.Entry<String, List<String>> en : this.linkTable.entrySet()) {
                Iterator<String> iterator = en.getValue().iterator();
                while (iterator.hasNext()) {
                    String next = iterator.next();
                    if (next.trim().equals(vertex)) {
                        iterator.remove();
                    }
                }
            }
        }
    
    
        public void addEdge(String from, String to) {
            if (!this.vertexes.contains(from) || !this.vertexes.contains(to)) {
                return;
            }
            List<String> toSet = this.linkTable.get(from);
            if (toSet == null) {
                toSet = new ArrayList<>();
                this.linkTable.put(from, toSet);
            }
            if (!toSet.contains(to)) {
                toSet.add(to);
            }
        }
    
    
        public void addDoubleEdge(String from, String to) {
            this.addEdge(from, to);
            this.addEdge(to, from);
        }
    
    
        public void removeEdge(String from, String to) {
            if (!this.vertexes.contains(from) || !this.vertexes.contains(to)) {
                return;
            }
            List<String> toSet = this.linkTable.get(from);
            if (toSet != null) {
                toSet.remove(to);
            }
        }
    
    
      
    
    
        @Override
        public String toString() {
            String str = "";
            for (Map.Entry<String, List<String>> en : this.linkTable.entrySet()) {
                str += en.getKey() + " -> [ ";
                Iterator<String> iterator = en.getValue().iterator();
                while (iterator.hasNext()) {
                    String next = iterator.next();
                    str += next + "  ";
                }
                str += " ]
    ";
            }
            return "UnweightedGraph{
    " + str + '}';
        }
    
    
        //深度优先
        public List<String> dfs() {
            if (this.vertexes.isEmpty()) {
                return Collections.EMPTY_LIST;
            }
            List<String> results = new ArrayList<>();
            Stack<String> stack = new Stack<>();
            String first = this.getVertexes().get(0);
    
    
            results.add(first);
            stack.push(first);
    
    
            while (!stack.isEmpty()) {
                String top = stack.peek();
                List<String> linkedVertexes = this.linkTable.get(top);
                String theOne = null;
                if (linkedVertexes != null) {
                    for (String s : linkedVertexes) {
                        if (!results.contains(s)) {
                            theOne = s;
                            break;
                        }
                    }
                }
                if (theOne == null) {
                    stack.pop();
                } else {
                    results.add(theOne);
                    stack.push(theOne);
                }
    
    
            }
            return results;
        }
    
    
        //广度优先
        public List<String> bfs() {
            if (this.vertexes.isEmpty()) {
                return Collections.EMPTY_LIST;
            }
            List<String> results = new ArrayList<>();
            Queue<String> queue = new LinkedList<>();
            String first = this.getVertexes().get(0);
    
    
            results.add(first);
            queue.add(first);
    
    
            while (!queue.isEmpty()) {
                String top = queue.peek();
    
    
                List<String> linkedVertexes = this.linkTable.get(top);
                String theOne = null;
                if (linkedVertexes != null) {
                    for (String s : linkedVertexes) {
                        if (!results.contains(s)) {
                            theOne = s;
                            break;
                        }
                    }
                }
                 if (theOne == null) {
                    queue.poll();
                } else {
                    results.add(theOne);
                    queue.add(theOne);
                }
    
    
            }
            return results;
        }
    
    
        public static void main(String[] args) {
            UnweightedGraph g = new UnweightedGraph();
            g.addVertexes("a");
            g.addVertexes("b");
            g.addVertexes("c");
            g.addVertexes("d");
            g.addVertexes("e");
    
    
            g.addDoubleEdge("a", "b");
            g.addDoubleEdge("a", "c");
            g.addDoubleEdge("b", "e");
            g.addDoubleEdge("b", "d");
            g.addDoubleEdge("c", "d");
            g.addDoubleEdge("d", "e");
    
    
            System.out.println(g.toString());
    
    
            List<String> dfs = g.dfs();
            System.out.println(dfs.toString());
    
    
            List<String> bfs = g.bfs();
            System.out.println(bfs.toString());
    
    
        }
    
    
    }
    
  • 相关阅读:
    PHP获取数组最大值下标的方法
    [转]SpeedPHP微信接口扩展
    SSL证书部署
    Windows server 2003+IIS6+PHP5.4.45环境搭建教程
    运行PHP出现No input file specified错误解决办法
    转载-lvs官方文档-LVS集群中的IP负载均衡技术
    转载-lvs官方文档04-LVS集群的负载调度
    官方文档-Linux服务器集群系统(一)
    转载-lvs官方文档-Linux服务器集群系统(二)
    linux系统参数统计脚本
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276144.html
Copyright © 2020-2023  润新知