图的存储——链式前向星
第一次听讲道理没听懂是啥玩意
然后觉得可能用处不大就没管
当我学Tarjan的时候,我哭了…
链式前向星
定义
前向星是一种特殊的边集数组。将边集数组中的每条边按照起点排序,起点相同按终点排序。记录下某个点为起点的所有边的数组中的起始位置和存储长度。
优势
可以在O(1)的时间找到以i为起点的第一条边,以O(len[i])的时间找到以i为起点的所有边的长度。但对于所有边按起点排序,以快排计算,至少为O(eloge)的时间复杂度。
如果将链表引入前向星,将会得到大幅优化。
代码实现
1.边集数组:
struct edge{ int e,n,w; }edges[MAXN];
e表示起点,n来存同起点的下一条边的位置,w是权重啦。maxn…最大边数。如果顶点数为n,那么MAXN=n*(n-1)/2
2.haad数组
顾名思义,存以i为起点的第一条边出边的存储位置。也就是以i为起点的所有出边的存储的起始位置
3.idx
记录边数的int变量…没啥说的…
加边函数
const int MAXN=101;//最大的顶点个数 struct edge{ int e,n,w; }edges[MAXN*(MAXN-1)]; int head[MAXN],idx=0; void addedges(int u,int v,int w){ edges[++idx].e=v; edges[idx].w=w; edges[idx].n=head[u]; head[u]=idx; }