图的深度优先搜索与广度优先搜索

 1     /**
 2      * dfs(vertex v){
 3      *     visit v;
 4      *     for each neighbor w of v
 5      *         if(w has not been visited){
 6      *         dfs(w);    
 7      *     }
 8      * }
 9      */
10     /*深度优先搜索从顶点  v 开始*/
11     public Tree dfs(int v){
12         List<Integer> searchOrders = new ArrayList<Integer>();//被搜索顶点的顺序
13         int[] parent = new int[vertices.size()];//顶点的父结点
14         for (int i = 0; i < parent.length; i++) {
15             parent[i] = -1;
16         }
17         boolean[] isVisited = new boolean[vertices.size()];//跟踪已经访问过的结点
18         dfs(v, parent, searchOrders, isVisited);
19         
20         return new Tree(v, parent, searchOrders);
21     }
22     private void dfs(int v, int[] parent, List<Integer> searchOrders, boolean[] isVisited){
23         searchOrders.add(v);
24         isVisited[v] = true;
25         
26         for(int i : neighbors.get(v)){
27             if(!isVisited[i]){
28                 parent[i] = v;
29                 dfs(v, parent, searchOrders, isVisited);
30             }
31         }
32     }
33     /**
34      * 广度优先搜索
35      * bfs(vertex v){
36      *     create an empty queue for storing vertices to be visited;
37      *     add v into the queue;
38      *     mark v visited
39      *     while the queue is not empty{
40      *     dequeue a vertex, say u, from the queue
41      *     add u into list for traversed vertices;
42      *     for each neighbor w of u
43      *     if w has nor been visited{
44      *        add w into the queue;
45      *        mark w visited;
46      *        }
47      * }
48      * }
49      */
50     public Tree bfs(int v){
51         List<Integer> searchOrders = new ArrayList<Integer>();
52         int[] parent = new int[vertices.size()];
53         for (int i = 0; i < parent.length; i++) {
54             parent[i] = -1;
55         }
56         java.util.LinkedList<Integer> queue = new  java.util.LinkedList<Integer>();
57         
58         boolean[] isVisited = new boolean[vertices.size()];
59         queue.offer(v);//进入队列
60         isVisited[v] = true;
61         
62         while(!queue.isEmpty()){
63             int u = queue.poll();//从队列中取出元素
64             searchOrders.add(u);
65             for(int w:neighbors.get(u)){
66                 if(!isVisited[w]){
67                     queue.offer(w);//进入队列
68                     parent[w] = u;
69                     isVisited[w] = true;//进入队列的结点就表示已经被访问过
70                 }
71             }
72         }
73         return new Tree(v, parent, searchOrders);
74     }

 

posted @ 2013-11-21 11:04  soul390  阅读(183)  评论(0)    收藏  举报