zoukankan      html  css  js  c++  java
  • 图的遍历(DFS、BFS)

    理论:

    深度优先搜索(Depth_Fisrst Search)遍历类似于树的先根遍历,是树的先根遍历的推广:

    广度优先搜索(Breadth_First Search) 遍历类似于树的按层次遍历的过程:

    java实现

    Vertex.java

    package 图;
    
    public class Vertex{
        String value;
        boolean isVisited;
        Vertex(String value)
        {
            this.value=value;
            this.isVisited=false;
        }
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
        public boolean isVisited() {
            return isVisited;
        }
        public void setVisited(boolean isVisited) {
            this.isVisited = isVisited;
        }
        
    }

    Edge.java

    package 图;
    
    
    public class Edge{
        Vertex start;
        Vertex end;
        int value;
        public Vertex getStart() {
            return start;
        }
    
        public void setStart(Vertex start) {
            this.start = start;
        }
    
        public Vertex getEnd() {
            return end;
        }
    
        public void setEnd(Vertex end) {
            this.end = end;
        }
    
        public int getValue() {
            return value;
        }
    
        public void setValue(int value) {
            this.value = value;
        }
    
        Edge(Vertex start,Vertex end, int value){
            this.start=start;
            this.end=end;
            this.value=value;
        }
    }

    Graph.java

    package 图;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Stack;
    
    
    public class Graph {
        
        public static List<Vertex> vertexList=new ArrayList<Vertex>();
        public static List<Edge> EdgeQueue=new ArrayList<Edge>();public static List<Vertex> depthVertexQueue=new ArrayList<Vertex>();
        public static List<Vertex> breathVertexQueue=new ArrayList<Vertex>();
        
        public static void buildGraph(){
            Vertex a=new Vertex("a");
            vertexList.add(a);
            Vertex b=new Vertex("b");
            vertexList.add(b);
            Vertex c=new Vertex("c");
            vertexList.add(c);
            Vertex d=new Vertex("d");
            vertexList.add(d);
            Vertex e=new Vertex("e");
            vertexList.add(e);
            Vertex f=new Vertex("f");
            vertexList.add(f);
            
            
            addEdge(a,b,0);
            addEdge(a,c,0);
            addEdge(b,d,0);
            addEdge(b,e,0);
            addEdge(c,f,0);
            
        }
        
        public static void addEdge(Vertex start,Vertex end,int value){
            Edge e=new Edge(start,end,value);
            EdgeQueue.add(e);
        }

    public static Vertex getFirstUnvisitedNeighbor(Vertex origin){ Vertex unvisitedNeighbor=null; Iterator<Edge> iterator=EdgeQueue.iterator(); while(iterator.hasNext()) { Edge edge=iterator.next(); if(edge.getStart()==origin) { if(!edge.getEnd().isVisited) { unvisitedNeighbor=edge.getEnd(); break; } } } return unvisitedNeighbor; } public static void depthFirstVisit(Vertex origin){ if(origin==null) return; depthVertexQueue.add(origin); origin.setVisited(true); Vertex curVertex=origin; Stack<Vertex> stack=new Stack<Vertex>(); stack.add(curVertex); while(!stack.isEmpty()) { curVertex=stack.peek(); Vertex tempVertex=getFirstUnvisitedNeighbor(curVertex); if(tempVertex!=null) { depthVertexQueue.add(tempVertex); tempVertex.setVisited(true); stack.push(tempVertex); } else { stack.pop(); } } } public static void breathFirstVisit(Vertex origin){ if(origin==null) return; breathVertexQueue.add(origin); origin.setVisited(true); List<Vertex> list=new ArrayList<Vertex>(); Vertex curVertex=origin; list.add(curVertex); while(!list.isEmpty()) { curVertex=list.remove(0); while(getFirstUnvisitedNeighbor(curVertex)!=null) { Vertex tempVertex=getFirstUnvisitedNeighbor(curVertex); breathVertexQueue.add(tempVertex); tempVertex.setVisited(true); list.add(tempVertex); } } } public static void main(String[] args) { buildGraph(); depthFirstVisit(vertexList.get(0)); for(Vertex each:depthVertexQueue) System.out.print(each.getValue()+" "); } }
  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/huangcongcong/p/4006209.html
Copyright © 2011-2022 走看看