【数据结构】图

为什么要有图

当我们处理多对多的关系时,就要用到图

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

图的常用概念

1.顶点

2.边

3.路径

4.无向图

5.有向图

6.带权图(这种边带权值的图也叫网)

图的表示方式

图的表示方式有两种:二维数组表示(邻接矩阵);数组加链表表示(邻接表)

邻接矩阵

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

邻接表

1.邻接矩阵需要为每个顶点都分配 n 个边的空间,其实有很多个边都是不存在的,这样会造成一定的空间损失

2.邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由 数组+链表 组成

说明

1.标号为 0 的节点的相关联的节点为 1 2 3 4

2.标号为 1 的节点的相关联的节点为 0 4

3.标号为 2 的节点的相关联的节点为 0 4 5

. . . . . .

图的入门案例

要求:用代码实现如下结构

思路分析

1.存储顶点 String 使用 ArrayList

2.使用邻接矩阵 int[][] edges 保存边之间的关系

代码实现
public class Graph {
    private ArrayList<String> vertexList;  //存储顶点的集合
    private int[][] edges;  //存储图对应的邻接矩阵
    private int numOfEdges;  //表示边的数目

    public static void main(String[] args) {
        //测试
        int n = 5;  //节点的个数
        String Vertexs[] = {"A", "B", "C", "D", "E"};
        //创建图对象
        Graph graph = new Graph(n);
        //循环的添加顶点
        for (String vertex : Vertexs) {
            graph.insertVertex(vertex);
        }

        //添加边
        // A-B  A-C  B-C  B-D  B-E
        graph.insertEdge(0, 1, 1);
        graph.insertEdge(0, 2, 1);
        graph.insertEdge(1, 2, 1);
        graph.insertEdge(1, 3, 1);
        graph.insertEdge(1, 4, 1);

        graph.showGraph();
    }

    //构造器
    public Graph(int n) {
        //初始化矩阵和 vertexList
        edges = new int[n][n];
        vertexList = new ArrayList<String>(n);
        numOfEdges = 0;
    }

    //图中常用的方法
    //返回节点的个数
    public int getNumOfVertex() {
        return vertexList.size();
    }
    //返回边的个数
    public int getNumOfEdges() {
        return numOfEdges;
    }
    //返回节点 i(下标)对应的数据 0->"A" 1->"B" 2->"C"
    public String getValueByIndex(int i) {
        return vertexList.get(i);
    }
    //返回 v1 和 v2 的权值
    public int getWeight(int v1, int v2) {
        return edges[v1][v2];
    }
    //显示图对应的矩阵
    public void showGraph() {
        for (int[] link : edges) {
            System.out.println(Arrays.toString(link));
        }
    }

    //插入节点
    public void insertVertex(String vertex) {
        vertexList.add(vertex);
    }

    //添加边
    /**
     *
     * @param v1  代表第一个顶点对应的下标
     * @param v2  代表第二个顶点对应的下标
     * @param weight
     */
    public void insertEdge(int v1, int v2, int weight) {
        edges[v1][v2] = weight;
        edges[v2][v1] = weight;
        numOfEdges++;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值