图的邻接矩阵遍历dfs,bfsjava实现
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
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13