Java数据结构与算法之图

六、图

1. 图基本介绍

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

1.1 图的举例说明

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

Java数据结构与算法之图

1.2 图的常用概念

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

Java数据结构与算法之图

5)有向图

Java数据结构与算法之图

6)带权图

Java数据结构与算法之图

1.3 图的表示方式

1.3.1 邻接矩阵

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

Java数据结构与算法之图

1.3.2 邻接表

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

Java数据结构与算法之图

1.4 图的快速入门案例

Java数据结构与算法之图

思路
(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++;
    }
}

结果打印:

Java数据结构与算法之图

上一篇:SDNU 1185.统计数字(水题)


下一篇:图的基本操作