图论之邻接表的数组实现
虽然邻接矩阵真的很方便,很简单,很利于理解,但却有着一些重大缺陷; 当我们遇到的是一张稀疏图的时候,邻接矩阵就造成严重的空间浪费,更直接一点,就是根本存不下来; 这个时候就不得不考虑其他存图方式了,这个时候另一种流行的存图方式就登场了——邻接表,当然使用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;//将