一、图的存储方式
邻接矩阵和邻接表是存储图的两种不同方式,一般邻接矩阵用于稠密图的存储,而邻接表用于稀疏图的存储
假设一个图有n的顶点,m条边:
1、当n*n 远大于 m时,就称为稀疏图,采用邻接表可以节省空间,也可以降低时间复杂度
2、当n*n 与 m较为接近时,就可以采用邻接矩阵
邻接表是完全可以代替邻接矩阵
二、实现邻接表
一般邻接表都是使用指针链表来实现的,但是在实际应用中较为麻烦,所以采用数组来实现邻接表,这种方法为每个顶点i(i从1~n)都设置了一个链表,里面保存了从顶点i出发的所有的边
实现方法:
1、需要对每条边进行1~m的编号
2、用u[]、v[]、w[]三个数组来记录每条边的信息,即u[i]、v[i]、w[i]表示第i条边是从第u[i]号顶点到v[i]顶点(u[i] -> v[i]),且权值为w[i]
3、first[]数组的1~~n号单元格分别用来存储1~n号顶点的第一条边的编号,下标表示边的起始顶点,即first[u[i]]保存顶点u[i]的第一条边的编号,初始时由于没有边加入所以都是-1
4、next[]数组存储编号为i的边的下一条边的编号
由上面的实现方法可知,一般u、v、w、next数组的数组大小定为m+1(m为边个数),first数组的数组大小定为n+1(n为顶点个数),当然也可以统一设置为较大的空间
存储过程:
1、首先录入a b c(顶点a->顶点b的权值为c),分别记录在u、v、w数组,假设abc编号为第i条边
2、如果first数组下标为u[i]的数值为-1,那么就在first[u[i]]存储第i条边;
如果first数组下标为u[i]的数值不为-1,那么现在next数组下标为i(当前边)存储first[u[i]](上一条边),之后first数组下标为u[i]的数值变为i(变为当前边)(此处较难理解)
假设有4个顶点、5条边,边的数据如下
1 4 9
4 3 8
1 2 5
2 4 6
1 3 7
代码如下
#include <stdio.h>