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

	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条边,输出的第一行是深搜结果,第二行是广搜结果。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121588847