图的基础知识(2、存储)

图须要存储的信息有如下这些java

一、顶点信息数组

二、边或弧的信息,若是有权,也须要表示出来it

三、顶点个数、边(弧)的个数class

 

邻接矩阵及其实现效率

顶点数据存储:List

一维数组遍历

边(弧)信息存储im

邻接矩阵链表

图中n个顶点之间相邻关系的n阶矩阵(即二维数组a[n][n])数据

下面举例说明

无向图邻接矩阵,中间斜着的一条线上的0,表明的意义是同一顶点,其他部分,1表明2顶点之间有边,0表明无边。

无向网邻接矩阵,中间斜着的一条线上的0,表明的意义是同一顶点,其他部分,用一个大于全部边的权值的值来表示没有没有边,具体的值表示边上的权值。

有向图邻接矩阵,有几个特色,不必定对称,行方向上的非0元素的个数意味着该顶点的出度,列方向上的非0元素的个数意味着该顶点的入度。

 

邻接矩阵法的优势:

容易实现图的操做,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点

邻接矩阵法的缺点:

n个顶点,须要n*n个单元存储边(弧),空间效率为O(n2),

对于稀疏图的话,尤为浪费空间

 

图的java定义,图当中顶点类型为int,而后有4个顶点,6条边(弧),该定义既能够表示有向图,也能够表示无向图,同时也能够表示有整形权的网。

public class Graph {
    int vn;
    int en;
    int[] vex;
    int[][] arc;
    
    public static void main(String[] args){
        Graph graph = new Graph();
        graph.vn = 10;
        graph.en = 20;
        graph.vex = new int[graph.vn];
        graph.arc = new int[graph.vn][graph.vn];
    }
}

 

建图运算,咱们设置了1,2,3,4一共四个顶点,而后,在全部不一样顶点之间画上了边,其实这里咱们就是作了一个彻底图(至因而有向仍是无向,全看你怎么理解和使用了)

        for (int i = 1; i <= 4; i ++){
            graph.vex[i - 1] = i;
        }

        for (int i = 1; i <= 4; i ++){
            for (int j = 1; j <= 4; j ++) {
                graph.arc[i - 1][j - 1] = i == j ? 0 : 1;
            }
        }

 

邻接表及其实现

是顺序与连接相结合的图的存储方式

全部顶点组成一个数组,为每一个顶点创建一个单向链表

下面仍是举例说明

无向图邻接表

无向网邻接表,增长了每一条边的权值信息

有向图邻接表

邻接表的优势:

空间效率高;容易寻找顶点的邻接点

邻接表的缺点:

对于有向图而言,查询顶点的出度很容易,可是要查询入度,就须要遍历整个表。

 

邻接表的java定义,这里咱们跟前面的概念部分有所不一样,不过问题不大,须要注意的是,若是是网的存储的话,这样的作法就不行了,可能须要针对边,再作一个类。

public class GraphWithLink {
    Vex[] vex;
    List<Vex> arc = new LinkedList<Vex>();
    int vn;
    int en;
}

public class Vex {
    int i;
}

建图运算,咱们仍是建一个4个顶点的彻底图

    public static void main(String[] args){
        GraphWithLink graph = new GraphWithLink();
        graph.vn = 4;
        graph.en = 6;
        graph.vex = new Vex[graph.vn];
        for (int i = 1; i <= 4; i ++){
            Vex vex = new Vex();
            vex.i = i;
            graph.vex[i - 1] = vex;
        }

        for (int i = 1; i <= 4; i++) {             graph.arc.add(graph.vex[i - 1]);             for (int j = 1; j <= 4; j++) {                 if (i != j){                     graph.arc.add(graph.vex[j - 1]);                 }             }         }     }

相关文章
相关标签/搜索