美文网首页数据结构与算法
图(一,图的基本概念)

图(一,图的基本概念)

作者: 腊鸡程序员 | 来源:发表于2019-03-18 10:49 被阅读0次
58.jpg
图的概念:

由顶点的有穷非空集合和顶点之间的边组成.
like this :


image.png
图的存储方式:

我们用邻接矩阵和邻接表来表示一个图

  • 邻接矩阵


    image.png
  • 邻接表


    image.png
图的遍历:
  • 深度优先
    以迷宫为例
    深度优先就是一直往下走,遇到走不通的地方就退回到分叉口,往另一个方向走


    image.png

    类似于树的前序遍历

  • 广度优先
    广度优先类似于树的分层遍历
    先访问当前顶点的所有邻接点,再往下一层访问
image.png

以上面的图为例:
深度优先:v0>v1>v3>退回到v0>v2>over
广度优先:第一步:v0>v1和v0>v2同时进行 next:v1>v3 结束

代码:
import java.util.LinkedList;

public class Graphic {

    public int[] vertices;//顶点集
    public int verticesSize;
    public int[][] matrix;//图的边信息
    public static final int MAX_WEIGHT = Integer.MAX_VALUE;
    public boolean[] isVisited;

    public Graphic() {
    }

    public Graphic(int verticesSize) {
        this.verticesSize = verticesSize;
        this.vertices = new int[verticesSize];
        this.matrix = new int[verticesSize][verticesSize];
        this.isVisited = new boolean[verticesSize];

        for (int i = 0; i < verticesSize; i++) {
            vertices[i] = i;
        }
    }

    //获取权重
    private int getWeight(int v1, int v2) {
        int weight = matrix[v1][v2];
        return weight == MAX_WEIGHT ? -1 : weight;
    }

    //获取顶点
    private int[] getVertices() {
        return vertices;
    }

    //获取入度
    private int getInDegree(int v) {
        int inDegree = 0;
        for (int i = 0; i < verticesSize; i++) {
            int weight = getWeight(i, v);
            if (weight > 0) {
                inDegree++;
            }
        }
        return inDegree;
    }

    //获取出度
    private int getOutDegree(int v) {
        int outDegree = 0;
        for (int i = 0; i < verticesSize; i++) {
            int weight = getWeight(v, i);
            if (weight > 0) {
                outDegree++;
            }
        }
        return outDegree;
    }

    //获取第一个邻接点
    private int getFirstNeightbor(int v) {
        for (int i = 0; i < verticesSize; i++) {
            if (getWeight(v, i) > 0) {
                return i;
            }
        }
        return -1;
    }

    //获取顶点v的邻接点index的下一个邻接点
    private int getNextNeightBor(int v, int index) {
        for (int i = index + 1; i < verticesSize; i++) {
            if (getWeight(v, i) > 0) {
                return i;
            }
        }
        return -1;
    }

    //深度优先

    public void dfs() {
        for (int i = 0; i < verticesSize; i++) {
            if (!isVisited[i]) {
                dfs(i);
            }
        }
    }

    private void dfs(int i) {
        isVisited[i] = true;
        System.out.println("visited vertices" + i);
        int v = getFirstNeightbor(i);
        while (v != -1) {
            if (!isVisited[v]) {
                dfs(v);
            }
            v = getNextNeightBor(i, v);
        }
    }

    //广度优先
    public void bfs() {
        for (int i = 0; i < verticesSize; i++) {
            isVisited[i] = false;
        }

        for (int i = 0; i < verticesSize; i++) {
            if (!isVisited[i]) {
                System.out.println("visited vertices: " + i);
                isVisited[i] = true;
                bfs(i);
            }
        }
    }

    private void bfs(int i) {
        LinkedList<Integer> linkedList = new LinkedList<>();
        //获取当前结点的邻接点
        int v = getFirstNeightbor(i);
        if (v <= 0) {
            return;
        }
        if (!isVisited[v]) {
            System.out.println("visited vertices:" + v);
            isVisited[v] = true;
            linkedList.offer(v);
        }

        //把后面的邻接点都入队
        int next = getNextNeightBor(i, v);
        while (next > 0) {
            if (!isVisited[next]) {
                System.out.println("visited vertices:" + next);
                isVisited[next] = true;
                linkedList.offer(next);
            }
            next = getNextNeightBor(i, next);
        }

        while (!linkedList.isEmpty()) {
            bfs(linkedList.poll());
        }
    }


}
    @Test
    public void test(){
        Graph graph = new Graph(5);
        int[] v0 = new int[]{0, 1, 1, MAX_WEIGHT, MAX_WEIGHT};
        int[] v1 = new int[]{MAX_WEIGHT, 0, MAX_WEIGHT, 1, MAX_WEIGHT};
        int[] v2 = new int[]{MAX_WEIGHT, MAX_WEIGHT, 0, MAX_WEIGHT, MAX_WEIGHT};
        int[] v3 = new int[]{1, MAX_WEIGHT, MAX_WEIGHT, 0, MAX_WEIGHT};
        int[] v4 = new int[]{MAX_WEIGHT, MAX_WEIGHT, 1, MAX_WEIGHT, 0};
        graph.matrix[0] = v0;
        graph.matrix[1] = v1;
        graph.matrix[2] = v2;
        graph.matrix[3] = v3;
        graph.matrix[4] = v4;
//        graph.dfs();
        graph.bfs();
    }

相关文章

  • Tensorflow入门

    基本概念 一、计算模型——计算图 1.1基本概念 计算图是Tensorflow最基本的概念,Tensorflow中...

  • 图(一,图的基本概念)

    图的概念: 由顶点的有穷非空集合和顶点之间的边组成.like this : 图的存储方式: 我们用邻接矩阵和邻接表...

  • TensorFlow 第一集

    基本概念 图(Graph):图描述了计算的过程,TensorFlow使用图来表示计算任务。 计算图(Computa...

  • 【网络挖掘】图的基本概念

    一、基本概念 1、柯尼斯堡七桥问题——“一笔画”问题 2、图基本概念:节点、边 3、有向图(边存在方向)、无向图(...

  • 如何用StartUML画时序图

    时序图 基本概念 时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。图...

  • E-R图相关

    一、E-R图基本概念 E-R图也称实体-联系图(Entity Relationship Diagram),提供了表...

  • 3. 最小生成树算法

    "图的基本概念"中,我们总结了无向图之连通图,有向图之强连通图概念,下面补充一些概念 连通网:在连通图中,若图的边...

  • 数据结构-图

    数据结构 - 图 目录: 基本概念无向图有向图 储存结构邻接矩阵邻接表十字链表(有向图)邻接多重表(无向图) 图的...

  • UML 类图详解

    基本概念 类图(Class Diagram): 类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类...

  • 思维导图法——如何绘制一幅思维导图

    思维导图是什么? 《思维导图基本概念》和《思维导图的基本原则》,已对思维导图做了介绍。 这里再总结下思维导图的几个...

网友评论

    本文标题:图(一,图的基本概念)

    本文链接:https://www.haomeiwen.com/subject/qceflqtx.html