数据结构小白之图的介绍和基础表示方法

 1.图的简介

1.基础介绍

图作为一种数据结构,其中的节点可以具有零个或者多个相邻元素,两个节点的连线称为边

2.图片展示

3.为什么要有图?

根据前面了解的知识,学习了线性表和树。就线性表而言,局限于一个直接前驱和一个直接后继的关系;对于树而言,也只能有一个直接前驱(表示一对多的关系),所以无论是线性表或者是树存在着一定的局限性。所以如果需要表示多对多的关系时,可以使用图。

4.图的几个基础概念(就着上图解释一波)

顶点(vertex): 就是上图中的A B C D E点,在代码中我们可以使用一定的数据结构将其整理

边(edge): AB,AC ...的连线,在代码中我们可以使用二维数组来的两个坐标表示边

权值(weight): 在图的边可以附上一定的值,在代码中我们可以使用二维数组的值表示权值

无向图: 顶点之间的连接是无方向的,比如A-B 可以是A->B 也可以是B->A

扫描二维码关注公众号,回复: 9322803 查看本文章

有向图: 顶点之间的连接是有方向的,比如A->B 和 B->A是不同的

带权图: 边是带有权值的,也被称为网

2.图的表示方法

1.如何表示图

图的表示方法有两种,一种是二维数组表示(邻接矩阵),一种是链表表示(邻接表)

2.邻接矩阵的表示思路:

(1):变量定义

 //存储顶点的集合
    private static ArrayList<String> vertexList;
    //二维数组存储矩阵
    private int[][]edges;//存储图对应的邻接矩阵
    private static int numOfEdges;//边的数目

    //定义数组boolean[]记录某个节点是否被访问过
    private static boolean []isVisited;

(2):方法设计

 //开始初始化
    public Graph(int n){
        //初始化矩阵和ArrayList
        //如果有n个节点,说明矩阵为n*n的
        edges=new int[n][n];
        //设置存储节点的链表
        vertexList=new ArrayList<String>(n);
        //初始化边的个数 默认为0
        numOfEdges=0;
        isVisited=new boolean[n];
    }
 /**
     * 图中常用的方法
     * */
    //1.返回节点的个数
    public int getNumOfVertex(){
        return vertexList.size();
    }
    //2.得到边的数目
    public int getNumOfEdges(){
        return numOfEdges;
    }
    //3.返回节点i(下标)对应的下标 0->"A" 1->"B" 2->"C"
    public String getValueByIndex(int i){
        return vertexList.get(i);
    }
    //4.返回边的权值
    public int getWeight(int v1,int v2){
        return edges[v1][v2];
    }
    //5.显示图对应的矩阵
    public void showGraph(){
        //遍历二维数组
        for(int []link:edges){
            System.out.println(Arrays.toString(link));
        }
    }
/**
    主方法测试
*/
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);
        }
        //为0
        System.out.println("节点信息"+vertexList);

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

测试结果:


 

发布了193 篇原创文章 · 获赞 70 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/Lzinner/article/details/103526440