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条边,输出的第一行是深搜结果,第二行是广搜结果。