邻接矩阵(Adjacency Matrix):
图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: arc[n][n] |
arc[i][j] = 1 若(Vi,Vj)∈E 或 <Vi,Vj>∈E; arc[i][j] = 0 反之 无向图的边数组是一个对称矩阵。 |
图中的每条边上带有权的图叫做网
设图有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:
arc[i][j]
|
arc[i][j] = Wij 若(Vi,Vj)∈E 或 <Vi,Vj>∈E
arc[i][j] = 0 若i=j
arc[i][j] = ∞ 反之(∞表示一个计算机允许的、大于所有边上的权值的值,也就是一个不可能的极限值)
|
图中如果边数相对顶点较少,邻接矩阵就会对空间造成极大的浪费
邻接表(Adjacency List):
数组与链表相结合的存储方式称为邻接表。
1、图中顶点用一个一维数组存储,方便容易读取顶点信息。(也可以用链表)
2、图中每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点Vi的边表,有向图则称为顶点Vi作为弧尾的出边表。
顶点表的各个结点由data和firstedge两个域表示,data是数据域,存储顶点信息,firstedge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指向边表中下一个结点的指针。 | |
//方便找顶点出度 | //方便找顶点入度 |
带权值的网图,边表结点可以增加一个 weight |
十字链表(Orthogonal List):
顶点表结点结构 data firstin firstout 边表结点结构 tailvex(弧尾) headvex(弧头) headlink taillink |
firstin 表示入边表头指针,指向该结点的第一个入边表结点 firstout 表示出边表头指针,指向该结点的第一个出边表结点 tailvex 顶点表结点的一个出边表结点 headvex是指出边表结点的弧头结点在顶点表中的下标。 headlink 指入边表指针域,指向终点相同(headvex)的下一条边,taillink 指向起点相同(tailvex)的下一条边 |
实线相当于邻接表,虚线相当于逆邻接表 这样就可以找出结点的入度和出度了 V0出边指向结点V3,<V0,V3>, 所以firstout指向边表结点(0,3,ptr,ptr) V0入边有<V1,V0>,<V2,V0>, 所以firstlink指向边表结点(1,0,ptr,ptr)->(2,0,ptr,ptr) |
邻接多重表:
邻接表中删除一条边要遍历两次,针对这个,出现了邻接多重表。
边表结点 ivex ilink jvex jlink ivex和jvex是与某条边依附的两个顶点在顶点表中的下标,顶点表和邻接表相同。 ilink是指依附顶点ivex的下一条边,jlink指向依附顶点jvex的下一条边 右图,删除一条边只要把指向这条边的指针改为null即可 |
边集数组:
边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成。