图的储存方式 :1.邻接矩阵 2.邻接链表
邻接矩阵
(1)无向图:
第i行第j列表示节点i与节点j之间的联系
规定:
0:没有边 1:有边
自己指自己无意义设为0
我们可以发现这样接收关系后得到的矩阵为对称矩阵,矩阵[i,j]与矩阵[j,i]是一样的。这样其实就已经是浪费了一半的储存空间了。
对于无向图我们可以通过一维数组来储存【i,j】的关系
默认是取下三角的,我们可以从上到小,从左到右,对元素排序。而【i,j】表示的i与j之间的连通关系对应的下标是i(i+1)/2+j
需要注意的是第i行第j列,j<i,若j>i则换成第j行第i列
(2)有向图
【i,j】表示从i向j的有向联系是否存在
规定:0:没有边 1:有边
自己指自己无意义设为0
注意:1).对与邻接矩阵的储存方式而言,我们希望边的关系尽可能的多(稠密),这样才不会浪费开创的空间
2).若为加权图则是将1改为权值
(3)求度的问题:
无向图:第i行中1值的个数
有向图:度分为入度,出度
入度:第i列所有1的个数
出度:第i行所有1的个数
2.邻接链表
创建一个链表数组arr,arr【i】表示与i有联系的点组成的链表
typedef struct node *list;
struct node
{
int weight;//权值
list next;//连接的下一个节点
}
list graph[n];
链表表示图,对于无向与有向,只是自己编码逻辑的确定
对于【i,j】
无向则是在第i,j行的链表中连接对应的i节点或j节点
有向则是仅在第i行的链表中连接对应的j节点
注意:对于链表表示的图,我们希望边的关系尽可能的少。
(1)度的问题
无向图:i节点对应的链表中的相连节点的个数
有向图:
出度:i节点对应的链表中的相连节点个数
出度:创建逆链表图,通过i节点的逆链表中的相连节点的个数