zoukankan      html  css  js  c++  java
  • 图的基本概念(二)

    图的存储结构主要有两种:邻接矩阵和邻接表。

    什么是邻接矩阵?

    如果一个有向图含有n个顶点,则可以用n×n的布尔型矩阵adjacency[n][n]来存储图状结构。

    若顶点v邻接到顶点w,则adjacency[v][w]= true,否则adjacency[v][w]= false

    上述图状结构的表示方法称为邻接矩阵表示法。

    对于无向图而言,采用邻接矩阵表示法,则邻接矩阵必为对称矩阵,即adjacency[v][w]= adjacency[w][v]。

    下面是邻接矩阵实现的图状结构:

    template <int max_size>
    class Gragh
    {
        int count; //用来记录顶点数目
        bool adjacency[max_size][max_size]; //邻接矩阵,用来存放顶点和边的信息
    };

    什么是邻接表?

    除采用邻接矩阵表示图状结构外,还可以采用邻接表的方法实现图状结构。

    在邻接表表示法中,n个顶点的图状结构可以表示成一个含有n个元素的线性表(称为顶点表)和n个线性表(称为邻接表)。

    每个顶点对应一个邻接表,顶点v对应的邻接表记录了顶点v邻接到的所有顶点。

    顶点表和邻接表既可以采用链式线性表也可以采用顺序线性表。

    下面的图片是邻接表实现的图状结构示意图:

    注意:顶点表和邻接表都可以是链式存储(链表)也可以是顺序存储(数组)。

    下面左图中顶点表示数组,邻接表是链表。(左图的结构和hash表的结构相像)右图中顶点表是链表,邻接表也是链表。当顶点表和链接表均为链表的这种实现称为十字链表法。

               

     上面左图的实现:

    typedef int vertex;
    template <int max_size>
    class Graph
    {
        int count;  //顶点数
        list<vertex> neighbors[max_size]; //顶点表是数组,邻接表是链表,用c++内置的List
    };

    其中list是c++的常用容器之一,可参考:http://blog.csdn.net/yas12345678/article/details/52601578

     上面右图的实现(十字链表法):

    class edge;
    class vertex;
    class Graph 
    {
        vertex* first_vertex; //图中只有一个指向第一个顶点的指针
    };
    class edge  
    {
        vertex* end_point; //每条边中有指向邻接到的结点的指针
        edge* next_edge; //边中有指向邻接到顶点的下一条边的指针
    };
    class vertex
    {
        edge* first_edge; //每个点中有指向第一条边的指针
        vertex* next_vertex; //含有指向下一个顶点的指针
    };
  • 相关阅读:
    Java基础之线程最详细最精简的介绍
    Android基础之Android硬件
    Iphone客户端程序员半年工作总结
    Java基础之synchronized的讲解
    物联网能否落地?可裁剪嵌入式OS成关键
    java基础之Thread与Runnable的区别
    Android基础之小问题集锦
    Java基础之字符串匹配大全
    BPM 是与非 什么是BPM,如何辨别是否BPM产品,以及如何选择BPM产品
    Hello China操作系统的安装和使用
  • 原文地址:https://www.cnblogs.com/jeavenwong/p/8204683.html
Copyright © 2011-2022 走看看