• Java数据结构与算法之图


    六、图

    1. 图基本介绍

    当我们需要表示多对多的关系时,这里我们就用到了图。

    1.1 图的举例说明

    图是一种数据结构,其中结点可以具有零个或多个相邻元素两个结点之间的连接称为边结点也可以称为顶点

    1.2 图的常用概念

    1)顶点(vertex)
    2)边(edge)
    3)路径
    4)无向图

    5)有向图

    6)带权图

    1.3 图的表示方式

    1.3.1 邻接矩阵

    邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1....n个点。

    1.3.2 邻接表

    1)邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失。
    2)邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成。

    1.4 图的快速入门案例

    思路
    (1)存储顶点使用ArrayList
    (2)保存矩阵int[][]edges

    代码实现

    public class Graph {
    
    
    
        private ArrayList<Integer> vertexList; // 创建指定节点长度的数组
        private int[][] edges; // 存储边的数据
        private int edgesNum; // 边的数目
        private int weight; // 权重
    
        public static void main(String[] args) {
            int n = 8;
            int[] vertexs = {1,2,3,4,5,6,7,8};
            Graph graph = new Graph(n);
            for (int 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);
    
            graph.showGraph();
        }
    
        public Graph(int n) {
            vertexList = new ArrayList<Integer>(n);
            edges = new int[n][n];
        }
    
        // 返回节点的个数
        public int numOfVertex() {
            return vertexList.size();
        }
        
        // 显示图中的矩阵
        public void showGraph() {
            for (int[] edge:edges) {
                System.out.println(Arrays.toString(edge));
            }
        }
    
        // 得到边的数目
        public int numOfEdges() {
            return edgesNum;
        }
    
        // 返回节点下标i对应的数组
        public int showVertexList(int i) {
            return vertexList.get(i);
        }
    
        // 返回v1、v2的权值
        public int getWeightOfEdge(int v1, int v2) {
            return edges[v1][v2];
        }
    
        // 插入节点
        public void insertVertex(Integer vertex) {
            vertexList.add(vertex);
        }
    
        // 添加边
        public void insertEdge(int v1, int v2, int weight) {
            edges[v1][v2] = weight;
            edges[v2][v1] = weight;
            edgesNum++;
        }
    }
    

    结果打印:

  • 相关阅读:
    LeetCode-Pascal's Triangle
    macOS Sierra 10.12版本 显示隐藏文件
    Android主页导航:fragment+viewpager
    (转)Android工程出现 java.lang.NoClassDefFoundError错误解决方法
    Android Studio安装以及Fetching android sdk component information超时的解决方案
    Android项目使用Ant多渠道打包(最新sdk)
    eclipse或Myeclipse中web项目没有run on server时怎么办?
    mysq查询语句包含中文以及中文乱码,字符集 GBK、GB2312、UTF8的区别
    论HTML的div、span和label的区别
    斐波那契数列
  • 原文地址:https://www.cnblogs.com/njuptzheng/p/13325222.html
Copyright © 2020-2023  润新知