前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dfs——练习demo3(20届周新杰提供)

dfs——练习demo3(20届周新杰提供)

作者头像
红目香薰
发布2022-11-29 20:59:41
2240
发布2022-11-29 20:59:41
举报
文章被收录于专栏:CSDNToQQCode

对此二维数组进行深度搜索与广度搜索,并遍历结果。

代码语言:javascript
复制
static int[][] nums = { 
		{  0 , 1 , 0 , 0 , 0 , 0 , 0,  1 , 0},
		{  1 , 0,  1  ,0 , 1 , 0 , 0 , 0 , 0},
		{  0 , 1 , 0 , 1 , 0  ,0 , 0 , 0 , 0},
		{  0 , 0 , 1 , 0 , 1 , 1 , 0 , 0  ,0},
		{  0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0},
		{  0 , 0 , 0 , 1 , 0 , 0 , 1 , 1 , 0},
		{  0 , 0 , 0 , 0 , 0 , 1,  0 , 0 , 0},
		{  1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1},
		{  0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0}
		};

static String res[] = {"1","2","3","4","5","6","7","8","9" };

深搜的遍历过程就是尽可能深的搜索树的分支,当一个节点的所有子节点都被探寻过了,搜索将回溯到发现该节点的那那条边的起始节点 这个过程会一直持续到已发现节点可到达所有节点为止。 如果还存在未发现的节点则进程会随便选择一个未发现的节点重复以上的过程 整个进程直到所有节点都被访问过为止。 深搜遍历过程 从1开始搜索可以看到1的子节点有2、8两个,进程会依次对其进行深度优先搜索 进程先对2进行子节点的搜索可以看出2也有两个子节点3、5 然后进程又会对3进行子节点的搜索可以看出只有一个子节点4,而4没有子节点了这个时候进程就会回溯到2的位置然后对5进行子节点的搜索 可以看出5的子节点也是只有一个4,但是这个时候5还有一个父节点6没有被访问所以进程不会回溯到2的位置 而是对6进行子节点的搜索,6的子节点只有一个7这个时候进程又会发现6有父节点8没有访问过 所以进程会对8再次再次进行子节点的搜索,发现子节点只有6和9但是6已经访问过了,而9也没有子节点 到这里树的所有节点就完成了全部的探索了

代码语言:javascript
复制
package test;
public class dfs {
    // 构造图的边
    private int[][] edges = { 
    		{  0 , 1 , 0 , 0 , 0 , 0 , 0,  1 , 0},
    		{  1 , 0,  1  ,0 , 1 , 0 , 0 , 0 , 0},
    		{  0 , 1 , 0 , 1 , 0  ,0 , 0 , 0 , 0},
    		{  0 , 0 , 1 , 0 , 1 , 1 , 0 , 0  ,0},
    		{  0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0},
    		{  0 , 0 , 0 , 1 , 0 , 0 , 1 , 1 , 0},
    		{  0 , 0 , 0 , 0 , 0 , 1,  0 , 0 , 0},
    		{  1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1},
    		{  0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0}
            };
    // 构造图的顶点
    private String[] vertexs = {"1","2","3","4","5","6","7","8","9"};
    // 记录被访问顶点
    private boolean[] verStatus;
    // 顶点个数
    private int vertexsNum = vertexs.length;
    public void DFSTra() {
        verStatus = new boolean[vertexsNum];
        for (int i = 0; i < vertexsNum; i++) {
            if (verStatus[i] == false) {
                DFS(i);
            }
        }
    }
    // 递归深搜
    private void DFS(int i) {
        System.out.print(vertexs[i] + " ");
        verStatus[i] = true;
        //深度搜索子节点
        for (int j = firstAdjVex(i); j >= 0; j = nextAdjvex(i, j)) {
            if (!verStatus[j]) {
                DFS(j);
            }
        }
    }
    // 返回与i相连的第一个顶点
    private int firstAdjVex(int i) {
        for (int j = 0; j < vertexsNum; j++) {
            if (edges[i][j] > 0) {
                return j;
            }
        }
        return -1;
    }
    // 返回与i相连的下一个顶点
    private int nextAdjvex(int i, int k) {
        for (int j = (k + 1); j < vertexsNum; j++) {
            if (edges[i][j] == 1) {
                return j;
            }
        }
        return -1;
    }

    // 测试
    public static void main(String[] args) {
        new dfs().DFSTra();
    }

}

深搜结果

代码语言:javascript
复制
1 2 3 4 5 6 7 8 9 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档