图的深度优先搜索

【算法描述】

  • 从图中s点出发,并将这个点标记为已访问
  • 找到s的一个相邻点v,将这个点v标记为已访问
  • 找v的相邻点w,如果w存在且未被标记,就将w标记为已访问,如果w点不存在,就返回v点,再找v的另一相邻点
  • 直到图中所有点都被标记为已访问为止

对于上图,我们可以采用邻接矩阵来表示,构建一个5x5的矩阵

跟顶点0相邻的顶点有2,3,4,所以在矩阵中[0,2],[0,3],[0,4]都用T标记

【算法实现】

public class Graph {
    public int V;//顶点数
    public int E;//边的个数
    public boolean[][] adj;//邻接矩阵

    //以顶点数为参数的构造函数
    public Graph(int V) {
        this.V = V;
        this.E = 0;
        adj = new boolean[V][V];//初始化邻接矩阵
    }

    //添加以v,w为顶点的边
    public void addEdge(int v, int w) {
        adj[v][w] = true;
    }
}
public class DepthFirstSearch {
    private boolean[] visited;

    //g是要搜索的图,s是要访问的顶点
    public DepthFirstSearch(Graph g, int s) {
        visited = new boolean[g.V];
        dfs(g, s);
    }

    private void dfs(Graph g, int s) {
        visited[s] = true;
        System.out.print(s + " ");
        for (int v = 0; v < g.V; v++) {
            if (!visited[v] && g.adj[s][v]) {
                dfs(g, v);
            }
        }
    }
}
public class Main {
    public static void main(String[] args){
        Graph graph = new Graph(6);
        graph.addEdge(0, 2);
        graph.addEdge(0, 3);
        graph.addEdge(2, 5);
        graph.addEdge(5, 3);
        graph.addEdge(0, 4);
        graph.addEdge(1, 5);
        graph.addEdge(3, 1);
        graph.addEdge(4, 1);
        new DepthFirstSearch(graph, 0);

    }
}

【算法分析】

      其实用邻接矩阵表示图并不是最好的选择,如果一个图顶点个数很多,那么邻接矩阵将会占很大的空间,即使我们这里用的是布尔类型。其实可以采用邻接表数组来表示图,使用一个以顶点为索引的列表数组,其中每个元素都是和该顶点相邻的顶点列表

    上面的简单代码只能判断连通图,对于非连通图还应该遍历所有顶点确保每个顶点都被标记为已访问


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值