(HW)DFS与BFS(Java)

Posted Huayra

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(HW)DFS与BFS(Java)相关的知识,希望对你有一定的参考价值。

  1 import java.util.HashMap;
  2 import java.util.LinkedList;
  3 import java.util.Queue;
  4 import java.util.Stack;
  5 
  6 public class task1
  7 {
  8     public static void main(String[] args)
  9     {    
 10         Graph g = new Graph(5);
 11         g.createGraph();
 12         
 13         System.out.println("DFS(递归)");
 14         DFS(g, 0);
 15         System.out.println();
 16         for(Vertex p : g.vertex) //数组元素的拷贝
 17             p.isvisited = false;
 18         System.out.println("DFS(迭代)");
 19         DFS_iterative(g, 0);
 20         for(Vertex p : g.vertex)
 21             p.isvisited = false;
 22         System.out.print(‘\n‘ + "BFS" + ‘\n‘);
 23         BFS(g, 0);
 24     }
 25     
 26     //递归
 27     public static void DFS(Graph g, int index)
 28     {
 29         System.out.print(g.vertex[index].name + " ");
 30         g.vertex[index].isvisited = true;
 31         
 32         for(Vertex v : g.adjacencyMap.get(g.vertex[index]))
 33             if(v.isvisited == false)
 34             {
 35                 int i = g.locateVex(v.name);
 36                 DFS(g, i);
 37             }
 38     }
 39     
 40     //非递归
 41     public static void DFS_iterative(Graph g, int index)
 42     {
 43         Stack<Vertex> stack = new Stack<>();
 44         stack.push(g.vertex[index]);
 45         Vertex p;
 46         
 47         while(!stack.isEmpty())
 48         {
 49             p = stack.pop();
 50             if(p.isvisited == false)
 51             {
 52                 System.out.print(p.name + " ");
 53                 p.isvisited = true;
 54                 for(Vertex q : g.adjacencyMap.get(p))
 55                     if(q.isvisited == false)  //可避免重复入栈
 56                         stack.push(q); 
 57             }
 58         }
 59     }
 60     
 61     //BFS
 62     public static void BFS(Graph g, int index)
 63     {
 64         Queue<Vertex> queue = new LinkedList<>();
 65         Vertex p;
 66         System.out.print(g.vertex[index].name + " ");
 67         g.vertex[index].isvisited = true;
 68         queue.add(g.vertex[index]);  //每个元素仅入队一次
 69         
 70         while(!queue.isEmpty())
 71         {
 72             p = queue.poll();
 73             for(Vertex q : g.adjacencyMap.get(p))
 74                 if(q.isvisited == false)
 75                 {
 76                     System.out.print(q.name + " ");
 77                     q.isvisited = true;
 78                     queue.add(q);
 79                 }
 80         }
 81     }
 82 }
 83 
 84 class Vertex
 85 {
 86     char name;
 87     boolean isvisited;
 88     
 89     public Vertex(char name)
 90     {
 91         this.name = name;
 92         this.isvisited = false;
 93     }
 94 }
 95 
 96 class Graph
 97 {
 98     Vertex[] vertex;  //顶点数组
 99     int vexnum;  //顶点数
100     HashMap<Vertex, LinkedList<Vertex>> adjacencyMap;  //邻接表
101     
102     public Graph(int vexnum)
103     {
104         this.vertex = new Vertex[vexnum];
105         for(int i = 0; i < this.vertex.length; i++)
106             this.vertex[i] = new Vertex((char)(‘a‘ + i));
107         this.vexnum = vexnum;
108     }
109     
110     public void createGraph()
111     {
112         //各点与其邻接点的映射
113         this.adjacencyMap = new HashMap<>();
114         
115         
116         //无向图
117         //a的邻接点
118         /*LinkedList<Vertex> aNeighbors = new LinkedList<>();
119         aNeighbors.add(vertex[1]);
120         aNeighbors.add(vertex[2]);
121         //b的邻接点    
122         LinkedList<Vertex> bNeighbors = new LinkedList<>();
123         bNeighbors.add(vertex[0]);
124         bNeighbors.add(vertex[3]);
125         bNeighbors.add(vertex[4]);
126         //c的邻接点
127         LinkedList<Vertex> cNeighbors = new LinkedList<>();
128         cNeighbors.add(vertex[0]);
129         cNeighbors.add(vertex[3]);
130         //d的邻接点
131         LinkedList<Vertex> dNeighbors = new LinkedList<>();
132         dNeighbors.add(vertex[1]);
133         dNeighbors.add(vertex[2]);
134         dNeighbors.add(vertex[4]);
135         //e的邻接点
136         LinkedList<Vertex> eNeighbors = new LinkedList<>();
137         eNeighbors.add(vertex[1]);
138         eNeighbors.add(vertex[3]);
139         //建立映射
140         adjacencyMap.put(vertex[0], aNeighbors);
141         adjacencyMap.put(vertex[1], bNeighbors);
142         adjacencyMap.put(vertex[2], cNeighbors);
143         adjacencyMap.put(vertex[3], dNeighbors);
144         adjacencyMap.put(vertex[4], eNeighbors);*/
145         
146         
147         //有向图
148         //a的邻接点
149         LinkedList<Vertex> aNeighbors = new LinkedList<>();
150         aNeighbors.add(vertex[2]);
151         //b的邻接点
152         LinkedList<Vertex> bNeighbors = new LinkedList<>();
153         bNeighbors.add(vertex[0]);
154         //c的邻接点
155         LinkedList<Vertex> cNeighbors = new LinkedList<>();
156         cNeighbors.add(vertex[3]);
157         //d的邻接点
158         LinkedList<Vertex> dNeighbors = new LinkedList<>();
159         dNeighbors.add(vertex[1]);
160         dNeighbors.add(vertex[4]);
161         //e的邻接点
162         LinkedList<Vertex> eNeighbors = new LinkedList<>();
163         eNeighbors.add(vertex[1]);
164         //建立映射
165         adjacencyMap.put(vertex[0], aNeighbors);
166         adjacencyMap.put(vertex[1], bNeighbors);
167         adjacencyMap.put(vertex[2], cNeighbors);
168         adjacencyMap.put(vertex[3], dNeighbors);
169         adjacencyMap.put(vertex[4], eNeighbors);
170     }
171     
172     public int locateVex(char name)
173     {
174         int i;
175         for(i = 0; /*i != this.vertex.length && */name != this.vertex[i].name; i++);
176         return i;
177     }
178 }

 

以上是关于(HW)DFS与BFS(Java)的主要内容,如果未能解决你的问题,请参考以下文章

经典图算法Java代码实践:BFS,DFS以及几种最短路径算法

数据结构之DFS与BFS

(转)BFS与DFS

15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法

java BFS和DFS

java BFS和DFS