十大算法之广度优先遍历:
本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,具体方法如下:
用邻接矩阵存储图方法:
1.确定图的顶点个数和边的个数
2.输入顶点信息存储在一维数组vet中
3.初始化邻接矩阵;
4.依次输入每条边存储在邻接矩阵array中
输入边依附的两个顶点的序号i,j;
将邻接矩阵的第i行第j列的元素值置为1;
将邻接矩阵的第j行第i列的元素值置为1;
广度优先遍历实现:
1.初始化队列Q
2.访问顶点v;ifVisit[v]=1;顶点v入队Q;
3.while(队列Q非空)
v=队列Q的队头元素出队;
w=顶点v的第一个邻接点
while(w存在)
如果w未被访问,则访问顶点w;visited[w]=1;顶点w入队列Q
w=顶点v的下一个邻接点
如下代码参考此图完成:
实现代码如下:
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class BFS { private Object[] vet; //定义vet数组用来存放顶点信息 private int[][] array; //定义邻接矩阵存放图的顶点信息 private int vexnum; //存储边的条数 private boolean[] ifVisit;//存放结点是否被访问过 private List list = new ArrayList(); //定义一个临时的队列用来存放已经被访问过的结点 public static void main(String[] args) { // TODO Auto-generated method stub BFS map = new BFS(5); Character[] vet= {'A','B','C','D','E'}; map.addVet(vet); map.addEage(0, 1); map.addEage(0, 4); map.addEage(1, 3); map.addEage(2, 3); map.addEage(2, 4); System.out.println("广度优先遍历开始:"); map.bfs(); } //广度优先遍历 public void bfs(){ Queue queue = new LinkedList(); //定义一个队列 for(int i=0;i0;m = this.next(j, m)){ if(!ifVisit[m]){ queue.add(m); ifVisit[m] = true; visited(m); } } } } } } //获得当前结点 public int first(int i){ for(int j = 0;j0) return j; return -1; } public int next(int i,int k){ for (int j = k + 1; j < vexnum; j++) { if (array[i][j] > 0) return j; } return -1; } //初始化图的节点 private void addVet(Object[] object) { this.vet = object; } //往临时队列里添加已经访问过的结点,并输出 public void visited(int k){ list.add(vet[k]); System.out.print("->" + vet[k]); } //构建邻接矩阵,保存边的信息 public void addEage(int m,int n){ if(m!=n){ array[m][n]=1; array[n][m]=1; } else return; } //图的初始化 public BFS(int m){ vexnum = m; vet = new Object[m]; array = new int[m][m]; ifVisit = new boolean[m]; for(int i=0;i
代码不知道怎么回事丢了~~~~~
扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!
【技术服务】,详情点击查看:https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg