有向图的广度、深度优先遍历

基于List存储的邻接表,一个工具类,创建一个有向图:

代码如下:

package com.daxin;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author  daxin
 *
 * @email [email protected]
 *
 * @date 2017年9月24日 下午5:36:56
 *
 */
class Node {

    public Node(int val) {
        this.val = val;
    }

    int val;
    boolean visited;

}

public class BuildGraph {
    /**
     * 基于邻接表存储的有向图
     *
     *
     *
     * @return 返回有向图
     */
    public static List<List<Node>> buildGraph() {
        List<List<Node>> G = new ArrayList<>();

        Node a = new Node(0);
        Node b = new Node(1);
        Node c = new Node(2);
        Node d = new Node(3);
        Node e = new Node(4);

        List<Node> al = new ArrayList<>();
        al.add(a);
        al.add(b);
        al.add(c);
        List<Node> bl = new ArrayList<>();
        List<Node> cl = new ArrayList<>();
        List<Node> dl = new ArrayList<>();
        List<Node> el = new ArrayList<>();
        bl.add(b);
        bl.add(d);
        cl.add(c);
        cl.add(d);
        dl.add(d);
        dl.add(e);
        el.add(e);

        G.add(al);
        G.add(bl);
        G.add(cl);
        G.add(dl);
        G.add(el);

        return G;

    }
}

有向图的深度优先遍历:

package com.daxin;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author daxin
 * @email [email protected]
 * @date 2017年9月24日 下午3:08:20
 *
 */

public class Dfs {

    public static void main(String[] args) {
        dfsGraph(BuildGraph.buildGraph());
    }

    public static void dfsGraph(List<List<Node>> adjacencyList) {

        // vl是邻接表中的每一行的一个list
        for (List<Node> vl : adjacencyList) {
            dfs(adjacencyList, vl);

        }

    }

    public static void dfs(List<List<Node>> adjacencyList, List<Node> vhead) {

        for (int i = 0; i < vhead.size(); i++) {
            if (vhead.get(i).visited == false) {
                // 设置访问过
                vhead.get(i).visited = true;
                // 遍历其value
                System.out.println(vhead.get(i).val);
                // 递归调用,进行深度遍历
                dfs(adjacencyList, adjacencyList.get(vhead.get(i).val));
            }
        }

    }

}

有向图的广度优先遍历:

package com.daxin;

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

/**
 *
 * @author daxin
 *
 * @email [email protected]
 *
 * @date 2017年9月24日 下午5:39:19
 *
 */
public class Bfs {
    public static void main(String[] args) {
        bfsGraph(BuildGraph.buildGraph());
    }

    public static void bfsGraph(List<List<Node>> adjacencyList) {

        for (int i = 0; i < adjacencyList.size(); i++) {
            bfs(adjacencyList, adjacencyList.get(i));
        }

    }

    public static void bfs(List<List<Node>> adjacencyList, List<Node> vhead) {

        Queue<Node> q = new LinkedList<>();
        q.add(vhead.get(0));

        while (!q.isEmpty()) {
            Node n = q.remove();
            List<Node> vl = adjacencyList.get(n.val);
            if (n.visited == false) {
                System.out.println(n.val);
                n.visited = true;
            }
            for (int i = 0; i < vl.size(); i++) {
                //如果没有访问的话,则追加到队列
                if (adjacencyList.get(n.val).get(i).visited == false)
                    q.add(adjacencyList.get(n.val).get(i));
            }

        }

    }
}
时间: 2024-11-15 21:05:42

有向图的广度、深度优先遍历的相关文章

有向图的深度优先遍历算法的快速实现及应用

本文介绍使用java.util.*包中的HashMap 和 LinkedList 以及 ArrayList类快速实现一个有向图,并实现有向图的深度优先遍历算法. 如何构造图? 本文根据字符串数组来构造一个图.图的顶点标识用字符串来表示,如果某个字符串A的第一个字符与另一个字符串B的最后一个字符相同,则它们之间构造一条有向边<A,B>.比如,字符串数组{"hap","peg","pmg","god"}对应的有向图如下

各种图的创建以及广度,深度优先遍历(临接矩阵存储)

#include <stdio.h> #include <iostream> #include <limits.h> #include <queue> #define INFINTY INT_MAX //最大值 #define MaxVertexNum 100 //最大顶点数 using namespace std; typedef enum{DG,UDG,DN,UDN} GraphKind; //图的种类(有向图.无向图,又向网,无向网) typedef

JS 中的广度与深度优先遍历

现在有一种类似树的数据结构,但是不存在共同的根节点 root,每一个节点的结构为 {key: 'one', value: '1', children: [...]},都包含 key 和 value,如果存在 children 则内部会存在 n 个和此结构相同的节点,现模拟数据如下图: 已知一个 value 如 3-2-1,需要取出该路径上的所有 key,即期望得到 ['three', 'three-two', 'three-two-one']. 1.广度优先遍历 广度优先的算法如下图: 从上图可

图的广度、深度优先遍历 C语言

以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 6 #define _clr(x, y) memset(x, y, sizeof(x)) 7 #define N 1010 8 9 int head[N], tot; 10 struc

本周学习的代码(数构 深度 广度 优先遍历)

深度优先遍历代码: #include "stdafx.h" #include <stdio.h> #include <string.h> #define MVNum 100          //最大顶点数 typedef int InfoType;              //边的权值类型 typedef char*  VexType;          //顶点数据类型 typedef struct LinkNode{     //边结点 int adjv

数据结构(C实现)------- 图的深度优先遍历

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述: 假设给定图G的初始状态是所有顶点均未曾访问过,在G中任选一顶点vi为初始的出发点,则深度优先遍历可定义如下: 首先访问出发点vi,并将其标记为已被访问过:然后,依次从vi出发遍历vi的每一个邻接点vj,若vj未曾访问过,则以vj为新的出发点继续进行深度优先遍历,直至图中所有和vi有路径相通的顶点都被访问到为止.因此,若G是连通图,则从初始出发点开始的遍历过程结束

C++实现图的邻接矩阵的创建以及其深度优先遍历和广度优先遍历

#include<iostream> using namespace std; typedef char vertextype; typedef int edgetype; #define maxvex 100 #define infinity 1000 #include<queue> int visited[100]; class MGraph{ public: vertextype vexs[maxvex]; edgetype arc[maxvex][maxvex]; int

邻接矩阵 + 深度优先遍历

1 /** 2 知识点:(有向图) 3 强连通图的邻接矩阵存储图: 4 强连通图的深度优先遍历(递归方式实现) 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #define N 5 9 #define ARC 10 10 int visit[ARC]; 11 typedef struct { 12 char vex[ARC][N];///顶点 13 int arc[ARC][ARC]; 14 int numv,nume;///顶

基于邻接表存储的图的深度优先遍历和广度优先遍历

一.深度优先遍历是连通图的一种遍历策略.其基本思想如下: 设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y).若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过:然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边.上述过程直至从x出发的所有边都已检测过为止. 例如下图中: 1.从0开始,首先找到0的关