图的邻接矩阵遍历(dfs,bfs)(java实现)

该博客详细介绍了深度优先搜索(DFS)和广度优先搜索(BFS)两种图遍历算法的Java实现。在DFS中,使用递归方式遍历图,而BFS则采用队列进行。博客指出,尽管BFS通常不需要标记已访问节点,但在防止重复访问同一节点的情况下,此处使用了book数组。代码示例展示了如何遍历图并打印出路径。
摘要由CSDN通过智能技术生成
	public static void dfs(int index) {
		if(index==vexNums+1)
			return ;
		if(book[index]==0) {
			book[index]=1;
			System.out.print(index+" ");
			for(int i=1;i<=vexNums;i++) {
				if(book[i]==0&&edge[index][i]==1) 
					dfs(i);
			}
		}
	}

   传入的参数是首元素的数组下标,进入方法以后,先判断有没有超出范围,顶点数组和边数组都是从1开始存的,所以当index==vexNums+1的时候,说明已经遍历完了。这个时候就返回。如果没有遍历完,先看这个点有没有走过,如果没有走过,先标记为走过,然后打印出来,在从邻接矩阵中找和它有关系的其他点,如果那个点没有走过,并且和当前这个点有关系,则就开始深搜那个点。如果这个点没有与它相连的点,它走完for循环就会回退到上一个点去。

	public static void bfs() {
		Queue<Integer> queue=new LinkedList<Integer>();
		queue.add(vex[1]);//将首元素入队
		while(!queue.isEmpty()) {
			int temp=queue.poll();
			book[temp]=1;
			System.out.print(temp+" ");
			for(int i=1;i<=vexNums;i++) {
				if(edge[temp][i]==1&&book[i]==0) {
					queue.add(i);
					book[i]=1;
				}
			}
		}
	}

   bfs用到的就是队列,先将第一个顶点加入到队列中,然后进入循环,弹出队首,打印队首,然后遍历边数组,看有没有顶点与它有关系,如果有就直接加入到队里面。则时候有人就有疑问了,广搜一般不是不需要标记吗,为什么这块需要有个book数组呢?
在这里插入图片描述
当遍历到3顶点的时候,会将7入队,如果不标记,在遍历4顶点的时候,也会将7入队,这样一个顶点就重复入队了。所以需要用到book数组。


import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	static int vexNums;
	static int[][] edge;
	static int[] book; 
	static int[] vex;
	public static void main(String[] args) {
		Scanner scanner =new Scanner(System.in);
		vexNums=scanner.nextInt();
		int edgeNums=scanner.nextInt();
		book=new int[vexNums+1];
		Arrays.fill(book, 0);
		vex=new int[vexNums+1];//存点
		for(int i=1;i<=vexNums;i++) {//点就是按顺序来的
			vex[i]=i;
		}
		edge=new int[vexNums+1][vexNums+1];//存边
		//邻接矩阵初始化
		for(int i=1;i<=vexNums;i++) {
			for(int j=1;j<=vexNums;j++) {
				 edge[i][j]=0;
			}
 		}
		//输入边和点的信息,有向图,只用记录一个
		for(int i=1;i<=edgeNums;i++) {
			int a=scanner.nextInt();
			int b=scanner.nextInt();
			edge[a][b]=1;
		}
		dfs(1);
		System.out.println("");
		Arrays.fill(book, 0);
		bfs();
	}
	
	public static void dfs(int index) {
		if(index==vexNums+1)
			return ;
		if(book[index]==0) {
			book[index]=1;
			System.out.print(index+" ");
			for(int i=1;i<=vexNums;i++) {
				if(book[i]==0&&edge[index][i]==1) 
					dfs(i);
			}
		}
	}
	public static void bfs() {
		Queue<Integer> queue=new LinkedList<Integer>();
		queue.add(vex[1]);//将首元素入队
		while(!queue.isEmpty()) {
			int temp=queue.poll();
			book[temp]=1;
			System.out.print(temp+" ");
			for(int i=1;i<=vexNums;i++) {
				if(edge[temp][i]==1&&book[i]==0) {
					queue.add(i);
					book[i]=1;
				}
			}
		}
	}
}

接下来就是输入信息
8表示有8个顶点,9表示有9条边,输出的第一行是深搜结果,第二行是广搜结果。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值