图的常见术语:
1、无向图
所有的边无所谓方向的图
2、有向图
边有可能有方向也有可能没方向,边对图来说重要。
3、网络
边上有权重的图 (每一条边上有数字,用于表示一些作用)
边是顶点对,
无向边用(v,x) 双向通道
有向边用<v,x> 单向通道,表示从V到X的边
在程序中表现图分为两种,
1、邻接矩阵。
1+2+3+4+.....+n = (n+1)*n/2 = n(n+1)/2 ,所以第i行第j个的话 = (i*(i+1)/2+j) 为1则i和j相连
邻接矩阵的好处:
1、直观。简单。好理解
2、方便检查任意一堆顶点间是否存在边 (看第i行第j个是否等于1)
3、方便找任一顶点的所有“邻接点”(有边直接相连的顶点)
4、方便计算任一顶点的“度”(出度 该点发出的边数。入度 指向该点的边数)
怎么任一顶点计算度:
无向图:对应的行或者列中所有的非0元素的个数
有向图:对应行非0元素的个数是“出度”;对应列非0元素的个数是“入度”
邻接矩阵的坏处:
浪费空间:
存稀疏图时会浪费空间(点很多而边很少)有大量无效元素
存稠密图(特别是完全图 矩阵里值都为1)还是很划算
浪费时间:
统计稀疏图中一共有多少条边(扫描后找个数,但是个数很少)
2、邻接表
邻接表:N个头指针,只需要存放next,占用N个域;2E个结点(每条边存两遍),每个结点占用2个域(权重域和next各1个域)。共N+2E*2
邻接矩阵:共N^2个元素,每个元素只需要存放权重。共N^2个域
当两者相等时,N+2E*2=N^2
所以当E<N(N-1)/4时,是省空间的。
图的遍历
1、广度优先
2、深度优先