图:

元素之间存在多对多关系(线性表的元素之间存在前驱和后继,树的元素之间存在父子关系,图的任意元素之间都有可能存在关系)。
    由顶点的有穷非空集合和顶点之间边的集合组成。
    在图型数据结构中,数据被称为顶点,数据之间的关系补称为边。
    在图中不允许出现没有点,但可以没有边。
    G(V,E),V表示顶点,E表示边的集合。
各种图的定义:
    无向图:顶点与顶点之间没有方向,这种边称为无向边,边用无向序偶对表示(v,v1)。
    V={A,B,C,D} E={(A,B),(B,C),(C,D),(D,A)}
   在无向图中,如果任意两个顶点之间都存在边,这种图称为无向完全图,那这种图的边为n*(n-1)/2。

有向图:若顶点之间有方向,这种边称为有向边,也叫弧,用有序偶对表示<v,v1>,v1叫做弧头,v叫做弧尾。
注意:若不存在顶点到自身和边,也不存在重复出现的边这种图叫做简单图,数据结构课程中讨论的都是简单图,数据结构课程中讨论的都是
简单图。

在有向图中如果任意两个顶点之间存在方向相反的两条弧,这种图叫做有向完全图。

图中有很少边或弧的图叫做稀疏图,反之叫做稠密图。

如果图中的边或弧有相关的数据,数据称为权,这种图也叫做网(带权图)。
如果G(v,E)和G1(v1,E1),存在v1∈V,且E1∈E,那么G1是G的子图。

顶点与边的关系

顶点的度:指的是顶点相关联的边或弧的条目数。
    有向图又分为出度和入度。
    入度:其他顶点到该顶点的弧的条目数。
    出度:从该点出发到其他顶点的弧的条目数。
    顶点序列:从一个顶点到另一个顶点的路径,路径长度指的是路径上的边或弧的条目数。

连通图相关术语:

在无向图中,在顶点v到v1之间有路径,则称v到v1之间是连通的,如果任意两个顶点都是连通的,那么这种图称为连通图。
无向图中的极大连通子图称为连通分量:
    1、必须是子图
    2、子图必须是连通的
    3、连通子图含有极大的顶点数
在有向图中,任意顶点之间都存在路径,这种图叫做强连通图。
有向图中的极大连通子图称为有向的强连通分量。
在有向图中如果有一个顶点的入度为0,其他顶点的入度均为1,则是一颗有向树。

图的存储结构:

图的存储主要是两个方面:顶点,边
邻接矩阵:
    一个一维数组(顶点)和一个二维数组(边,弧)组成。
    二维数组i,i位置都是0,如果是无向图则数组对称(左上到右下对称)。
    优点:
        1、非常容易判定两顶点之间是否有边
        2、非常容易计算任意顶点的入度和出度。
        3、非常容易统计邻接点
    缺点:如果存储稀疏图,会非常浪费存储空间
邻接表:
    由顶点表                   边表组成。
    顶点  下一个邻接点地址      顶点下标|下一个邻接点地址      
    A     ->                   [1] -> [3] -> NULL
    B     ->                   [2] -> NULL
    C     ->                   [4] -> [3] -> NULL
    D     ->                   
    E     ->                   
    优点:
        1、节省存储空间
        2、非常容易计算出度
    缺点:不方便计算入度
十字链表:由于邻接表不能同时兼顾出度和入度,因此我们修改邻接的边表结构,使用即存储入度也存储出度,这种表就叫做十字链表。
邻接多重表:由于遍历表时需要一些删除边操作而邻接表在删除边时非常麻烦,因此就设计出了邻接多重表
边集数组:由两个一维数组构成,一个存储顶点的消息,另一个存储边的信息(它的每个数据元素都由一条边的起点到终点的下标和权组成),
这种存储结构更侧重于边的相关操作(路径、路径长度、最短路径),而统计顶点的度需要扫描整个数组,效率不高。

图的遍历:

注意:图的遍历结果无论是深度优先还是广度优先,结果都不唯一
深度优先:类似树的前序遍历。
广度优先:类似树的层序遍历(需要借助队列)