A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fantianfei 中级黑马   /  2015-7-1 10:07  /  300 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

分享一个,望版主不要再无缘无故删帖:
  1. /**
  2. * 图
  3. * @author DBJ(dubenju@126.com)
  4. */
  5. public class DefaultGraph implements Graph {

  6.     /** 顶点集  */
  7.     private ArrayList<Vertex> vertexes;
  8.     /** 邻接表  */
  9.     private ArrayList<LinkedList<Edge>> adjacencyList;
  10.     private int edgeSize;

  11.     /**
  12.      * 遍历
  13.      */

  14.     /**
  15.      * 深度优先遍历(DFS)
  16.      */
  17.     public void depthFirstTraversal(GraphVisitor visitor) {
  18.         // reset Visited
  19.         initVisit();
  20.         for(int i = 0; i < this.vertexes.size(); i ++) {
  21.             Vertex vertex = this.vertexes.get(i);
  22.             if(vertex.isVisited() == false) {
  23.                 do_DFS(vertex, visitor);
  24.             }
  25.         }
  26.     }

  27.     /**
  28.      * 深度优先遍历x
  29.      * @param v 顶点
  30.      * @param visitor
  31.      */
  32.     private final void do_DFS(Vertex v, GraphVisitor visitor) {
  33.         // first visit this vertex
  34.         visitor.visit(this, v);
  35.         v.setVisit(true);

  36.         // for each edge from this vertex, we do one time and this for loop is very classical in all graph algorithms
  37.         for(Edge e = firstEdge(v); isEdge(e); e = e.getNextEdge()) {
  38.             if(e.getTo().isVisited() == false) {
  39.                 do_DFS(e.getTo(), visitor);
  40.             }
  41.         }
  42.     }

  43.     /**
  44.      * 广度优先遍历(BFS)
  45.      */
  46.     public void breathFirstTraversal(GraphVisitor visitor) {
  47.         // reset Visited
  48.         initVisit();
  49.         for(int i = 0; i < this.vertexes.size(); i ++) {
  50.             Vertex vertex = this.vertexes.get(i);
  51.             if(vertex.isVisited() == false) {
  52.                 do_BFS(vertex, visitor);
  53.             }
  54.         }
  55.     }

  56.     /**
  57.      * 广度优先遍历x
  58.      * @param v 顶点
  59.      * @param visitor
  60.      */
  61.     private void do_BFS(Vertex v, GraphVisitor visitor) {
  62.         // BFS will use an queue to keep the unvisited vertexes. we can also just use java.util.LinkedList
  63.         LinkedList<Vertex> queue = new LinkedList<Vertex>();
  64.         queue.add(v);
  65.         while(!queue.isEmpty()) {
  66.             Vertex fromV = queue.poll();
  67.             if (fromV.isVisited() == false) {
  68.                 visitor.visit(this, fromV);
  69.                 fromV.setVisit(true);
  70.                 for(Edge e = firstEdge(fromV); isEdge(e); e = e.getNextEdge()) {
  71.                     Vertex toV = e.getTo();
  72.                     if(toV.isVisited() == false) {
  73.                         queue.add(toV);
  74.                     }
  75.                 }
  76.             }
  77.         }
  78.     }
  79.    
  80. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马