Java实现数据结构之深度优先搜索DFS和广度优先搜索BFS
2016-10-06 22:42
831 查看
package graph; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; /** * @author 作者 E-mail:923861438@qq.com * @date 创建时间:2016年10月6日 下午4:35:39 * @version 1.0 * @parameter * @since * @return */ public class Graph { final int MIN=-256; final int MAX=256; int numVertexes; int numEdges; String []vex; int acr[][]; public Graph() { vex=new String[MAX]; acr=new int[MAX][MAX]; } // 建立无向网图, 给图中的 顶点内容 和 边权重 赋值 public void buildGraph(Graph g) { //读入顶点数和边数 System.out.println("请输入顶点数:\n"); Scanner sc=new Scanner(System.in); numVertexes=sc.nextInt(); System.out.println("请输入边数:\n"); numEdges=sc.nextInt(); //读入顶点信息,建立顶点表 for(int i=0;i<g.numVertexes;i++) { System.out.print("第"+i+"个顶点信息为:"); vex[i]=sc.next(); } //邻接矩阵初始化 for(int i=0;i<g.numVertexes;i++) for(int j=0;j<g.numVertexes;j++) { g.acr[i][j]=MIN; } //读入边信息,建立邻接矩阵 for(int k=0;k<g.numEdges;k++) { System.out.println("请输入边(i,j)的下标i:\n"); int i=sc.nextInt(); System.out.println("请输入边(i,j)的下标j:\n"); int j=sc.nextInt(); System.out.println("请输入边(i,j)的权重w:\n"); int w=sc.nextInt(); g.acr[i][j]=w; g.acr[j][i]=g.acr[i][j]; } sc.close(); } public void printGraph(Graph g) { System.out.print(" "); for(int i=0;i<g.numVertexes;i++) { System.out.print(g.vex[i]+" "); } for(int i=0;i<g.numVertexes;i++) { System.out.println(); System.out.print(g.vex[i]+" "); for(int j=0;j<g.numVertexes;j++) { System.out.print(g.acr[i][j]+" "); } } } //深度优先遍历 public void DFSTraverse(Graph g) { //建立访问数组 boolean []visited=new boolean [g.numVertexes]; //初始化 访问顶点 for(int i=0;i<visited.length;i++) visited[i]=false; //对未访问顶点调用DFS for(int i=0;i<visited.length;i++) if(!visited[i]) DFS(g,i,visited); } //从顶点i开始进行的深度优先搜索DFS public void DFS(Graph g, int i, boolean[] visited) { visited[i]=true; System.out.print("已访问"+g.vex[i]+" "); for(int j=0;j<g.numVertexes;j++) { if(g.acr[i][j]>0 && !visited[j]) DFS(g,j,visited); } } //广度优先搜索 public void BFS(Graph g) { int i=0; Queue<Integer> q=new LinkedList<Integer>(); //建立访问数组 boolean visited[]=new boolean [MAX]; //初始化 访问顶点 for(i=0;i<g.numVertexes;i++) visited[i]=false; //对每个顶点做循环 for( i=0;i<g.numVertexes;i++) { if(!visited[i]) { visited[i]=true; System.out.print("已访问"+g.vex[i]+" "); q.offer(i); while(!q.isEmpty()) { i=q.poll(); for(int j=0;j<g.numVertexes;j++) { if(g.acr[i][j]>0 && !visited[j]) { visited[j]=true; System.out.print("已访问"+g.vex[j]+" "); q.offer(j); } } } } } } public static void main(String []args) { Graph g=new Graph(); g.buildGraph(g); g.printGraph(g); System.out.println(); System.out.println("深度优先搜索结果:"); g.DFSTraverse(g); System.out.println(); System.out.println("广度优先搜索结果:"); g.BFS(g); } }
<img src="http://img.blog.csdn.net/20161006224608948?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
</pre><pre name="code" class="java">《-------------------------------------------转载请注明出处----------------------------------------------》
相关文章推荐
- 【数据结构】深度优先搜索BFS和广度优先搜索DFS
- Java数据结构----图--深度优先遍历BFS和广度优先遍历DFS
- javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)
- Java数据结构----图--深度优先遍历BFS和广度优先遍历DFS
- 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS
- 广度优先搜索与深度优先搜索的 java 实现
- 深度优先搜索DFS和广度优先搜索BFS的总结
- 二叉树深度优先(DFS)和广度优先(BFS)算法的非递归实现
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
- matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
- 数据结构和算法之:图的深度优先和广度优先遍历及其Java实现
- 22.基于 邻接表 表示的 深度优先搜索dfs 和 广度优先搜索bfs
- 深度优先搜索DFS/广度优先搜索BFS的一个应用实例(华为编程大赛赛题)
- BFS_DFS深度广度优先C++实现。
- PAT 数据结构 05-图1. List Components (25) 深度搜索DFS和广度搜索BFS
- 树的存储结构和图的存储结构以及图的深度优先DFS搜索和BFS广度优先搜索
- 深度优先DFS和广度优先BFS的非递归实现
- 数据结构--图的理解:深度优先和广度优先遍历及其 Java 实现
- 深度优先和广度优先遍历及其 Java 实现
- 从Cheney算法->广度优先搜索->倒酒问题(JAVA实现)