您的位置:首页 > 理论基础 > 数据结构算法

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">《-------------------------------------------转载请注明出处----------------------------------------------》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐