• 图的深度优先遍历和广度优先遍历


    深度优先遍历是纵向遍历,一直到底,二叉树的前序遍历、中序遍历,后序遍历都是深度优先遍历。  

    广度优先遍历是横向遍历,层次遍历,遍历完一层再遍历下一层,直到遍历所有元素。

    以矩阵为例,分析深度优先遍历(DFS)和广度优先遍历的路径:

    插入矩阵:

        //测试一把图是否创建ok
            int n = 8;  //结点的个数
            String Vertexs[] = {"1", "2", "3", "4", "5", "6", "7", "8"};
            //创建图对象
            Graph graph = new Graph(n);
            //循环的添加顶点
            for (String vertex : Vertexs) {
                graph.insertVertex(vertex);
            }
            //更新边的关系
            graph.insertEdge(0, 1, 1);
            graph.insertEdge(0, 2, 1);
            graph.insertEdge(1, 3, 1);
            graph.insertEdge(1, 4, 1);
            graph.insertEdge(3, 7, 1);
            graph.insertEdge(4, 7, 1);
            graph.insertEdge(2, 5, 1);
            graph.insertEdge(2, 6, 1);
            graph.insertEdge(5, 6, 1);

    矩阵:

      

    深度优先遍历路径:1->2->4->8->5->3->6->7->

      

    广度优先遍历路径:1->2->3->4->5->6->7->8->

      

    代码实现:

      1 package wy.datastructures.graph;
      2 
      3 import java.util.ArrayList;
      4 import java.util.Arrays;
      5 import java.util.LinkedList;
      6 import java.util.List;
      7 
      8 public class Graph {
      9 
     10     private int[][] edges;
     11     private List<String> vertexList;
     12     private int numOfEdges;
     13     private boolean[] isVisited;
     14 
     15     public static void main(String[] args) {
     16         //测试一把图是否创建ok
     17         int n = 8;  //结点的个数
     18         String Vertexs[] = {"1", "2", "3", "4", "5", "6", "7", "8"};
     19 
     20         //创建图对象
     21         Graph graph = new Graph(n);
     22         //循环的添加顶点
     23         for (String vertex : Vertexs) {
     24             graph.insertVertex(vertex);
     25         }
     26 
     27         //更新边的关系
     28         graph.insertEdge(0, 1, 1);
     29         graph.insertEdge(0, 2, 1);
     30         graph.insertEdge(1, 3, 1);
     31         graph.insertEdge(1, 4, 1);
     32         graph.insertEdge(3, 7, 1);
     33         graph.insertEdge(4, 7, 1);
     34         graph.insertEdge(2, 5, 1);
     35         graph.insertEdge(2, 6, 1);
     36         graph.insertEdge(5, 6, 1);
     37 
     38 
     39         //显示一把邻结矩阵
     40         graph.showGraph();
     41 
     42         //测试一把,我们的dfs遍历是否ok
     43         System.out.println("深度遍历");
     44         graph.dfs(); // A->B->C->D->E [1->2->4->8->5->3->6->7]
     45         System.out.println();
     46         System.out.println("广度优先!");
     47         graph.bfs(); // A->B->C->D-E [1->2->3->4->5->6->7->8]
     48     }
     49 
     50     public void dfs(int index) {
     51         isVisited[index] = true;
     52         System.out.print(getVertex(index) + "->");
     53         for (int i = 0; i < getNumOfVertex(); i++) {
     54             if (edges[index][i] == 1 && !isVisited[i]) {
     55                 dfs(i);
     56             }
     57         }
     58     }
     59 
     60     public void dfs() {
     61         isVisited = new boolean[vertexList.size()];
     62         dfs(0);
     63     }
     64 
     65     public void bfs() {
     66         isVisited = new boolean[vertexList.size()];
     67         LinkedList<Integer> queue = new LinkedList<>();
     68         for (int x = 0; x < getNumOfVertex(); x++) {
     69             if (!isVisited[x]) {
     70                 isVisited[x] = true;
     71                 System.out.print(getVertex(x) + "->");
     72                 queue.addLast(x);
     73                 while (!queue.isEmpty()) {
     74                     int index = queue.removeFirst();
     75                     for (int y = 0; y < getNumOfVertex(); y++) {
     76                         if (edges[index][y] == 1 && !isVisited[y]) {
     77                             isVisited[y] = true;
     78                             queue.addLast(y);
     79                             System.out.print(getVertex(y) + "->");
     80                         }
     81                     }
     82                 }
     83             }
     84         }
     85     }
     86 
     87     public Graph(int n) {
     88         edges = new int[n][n];
     89         vertexList = new ArrayList<>(n);
     90         numOfEdges = 0;
     91         isVisited = new boolean[n];
     92     }
     93 
     94     public int getNumOfEdges() {
     95         return numOfEdges;
     96     }
     97 
     98     public int getNumOfVertex() {
     99         return vertexList.size();
    100     }
    101 
    102     public String getVertex(int index) {
    103         return vertexList.get(index);
    104     }
    105 
    106     public int getIndexOfVertex(String vertex) {
    107         return vertexList.indexOf(vertex);
    108     }
    109 
    110     public int getEdge(int v1, int v2) {
    111         return edges[v1][v2];
    112     }
    113 
    114     public void insertVertex(String vertex) {
    115         vertexList.add(vertex);
    116     }
    117 
    118     public void insertEdge(int v1, int v2, int weight) {
    119         edges[v1][v2] = weight;
    120         edges[v2][v1] = weight;
    121         numOfEdges++;
    122     }
    123 
    124     public void showGraph() {
    125         for (int[] link : edges) {
    126             System.out.println(Arrays.toString(link));
    127         }
    128     }
    129 
    130 }

    输出结果:

  • 相关阅读:
    epplus
    http://www.cmake.org/
    patheditor2
    emgu cv
    OpenCV
    Tesseract
    Blendar基金会
    安装服务windows,installutil
    R 软件
    历史为什么选择C语言?事实证明:暮年的C语言,依旧宝刀未老!
  • 原文地址:https://www.cnblogs.com/codewy/p/13413491.html
Copyright © 2020-2023  润新知