zoukankan      html  css  js  c++  java
  • 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++;
        }
    }
    

    结果打印:

  • 相关阅读:
    2020CCPC秦皇岛 K 【Kindom's Power】(树上贪心dp)
    对于树上状态机dp问题的一些总结与思考
    PTA_L3题解集
    PTA_L2题解集
    树上dp_学习笔记
    2020牛客国庆集训派对day2 B【Cheap Delivers】(最短路+状压dp)
    2020牛客国庆集训派对day1
    Codeforces 1426F【Number of Subsequences】(dp)
    2019icpc陕西省赛
    CF1281E【Jeremy Bearimy】(树上点对最大值/最小值和)
  • 原文地址:https://www.cnblogs.com/njuptzheng/p/13325222.html
Copyright © 2011-2022 走看看