图中两种搜索方式的模板

很多题目,需要我们 根据题意构建出图来,进行搜索 这时候,有两种搜索的模板,这里我都是采用二维数组来构建图

深度优先搜索

/**
 * 深度优先搜索的模板
 * 数组构建的图
 */
public class ArrayDFS {

    //根据题意构建有向图
    int[][] edges;

    //标记顶点是否被搜索过
    boolean[] marked;

    /**
     * 传入一个n * n 的题意矩阵来初始化图
     *
     * @param arr
     */
    public void initialization (int[][] arr) {
        edges = new int[arr.length][arr[0].length];
        marked = new boolean[arr.length];

        //根据题意 对edges赋值
        //edges[v][u] = 1 标记 v - u 存在一条边
    }

    /**
     * 对未被搜索过的顶点v进行深度优先搜索
     *
     * @param v
     */
    private void dfs (int v) {
        //标记顶点已被搜索
        marked[v] = true;

        //遍历v的邻接表 ,对未搜索过的顶点进行深度搜索
        for (int u = 0; u < edges[v].length; ++u) {
            //这里原图中edges[v][u] == 1 是表示存在v - u的边
            if (edges[v][u] == 1 && !marked[u]) {
                dfs(u);
            }
        }
    }
}

广度优先搜索

import java.util.LinkedList;
import java.util.Queue;

/**
 * 广度优先搜索
 * 数组构造图
 */
public class ArrayBFS {

    //根据题意构建有向图
    int[][] edges;

    //标记顶点是否被搜索过
    boolean[] marked;

    /**
     * 传入一个n * n 的题意矩阵来初始化图
     *
     * @param arr
     */
    public void initialization (int[][] arr) {
        edges = new int[arr.length][arr[0].length];
        marked = new boolean[arr.length];

        //根据题意 对edges赋值
        //edges[v][u] = 1 标记 v - u 存在一条边
    }

    /**
     * 从未被搜索过的顶点v 进行广度优先搜索
     *
     * @param v
     */
    private void bfs (int v) {
        //创建队列
        Queue< Integer > queue = new LinkedList<>();
        //顶点入队
        queue.add(v);

        //开始进行弹出顶点 处理
        while (!queue.isEmpty()) {
            //从队首弹出一个顶点
            int e = queue.poll();
            //遍历顶点e的邻接表,将未被搜索过的顶点加入到队列中
            for (int u = 0; u < edges[e].length; ++u) {
                if (edges[e][u] == 1 && !marked[u]) {
                    queue.add(u);
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值