虽然邻接矩阵真的很方便,很简单,很利于理解,但却有着一些重大缺陷;
当我们遇到的是一张稀疏图的时候,邻接矩阵就造成严重的空间浪费,更直接一点,就是根本存不下来;
这个时候就不得不考虑其他存图方式了,这个时候另一种流行的存图方式就登场了——邻接表,当然使用vector数组也是一种良好的选择;
邻接表的实现可以通过链表或数组的方式实现,我这里主要讲数组的实现方法;
首先,有三个数组,分别为u[max],v[max],w[max]分别代表着每条边的起点,终点,权重,而下标则代表着边的编号;
然后设立first[max],next[first]这两个数组;
first数组存储的是边的编号,下标代表的是边的起始结点;
next数组存储的是编号为i的前一条边的编号,其中i就是下标;
那么插入一条边的过程就是这样的:
首先将边读入到u,v,w这三个数组中;
然后根据u找到first数组中下标为u的那栏,如果为空,就将边的编号直接加入其中,否则,将这编号放入对应的next数组中,将first数组中存新加入的结点编号;
int n,m;//结点数目,边的数目
int u[1000],v[1000],w[1000];//边的起点,终点,权重
int first[1000],next[1000];
cin>>n>>m;
for(int i=1;i<=n;++i)
{
first[i]=-1;//将-1作为标志,完成初始化
}
for(int i=1;i<=m;++i)
{
cin>>u[i]>>v[i]>>w[i];
next[i]=first[u[i]];
first[u[i]]=i;
}
来源:CSDN
作者:LeeHolmes
链接:https://blog.csdn.net/LeeHolmes/article/details/51367842