• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

图的邻接矩阵遍历dfs,bfsjava实现

武飞扬头像
禹哥。。。
帮助3

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfibhae
系列文章
更多 icon
同类精品
更多 icon
继续加载