存图的各种数据结构,复杂如下
邻接矩阵 O(1)(查询一条边) O(n)枚举出边 O(N*N)空间复杂度
前向星 O(n)(查询一条边) O(n)枚举出边 O(N)空间复杂度 (预处理时间复杂度(O(NlgN)))
链式前向星 O(n)(查询一条边) O(n)枚举出边 O(N)空间复杂度
我们发现对于与一道题若n逼近10^6时,前两者的时间就不行了,而链式前向星还可以支撑这种数据规模
那么链式前向星究竟是什么呢?
对于和结点u有边连接的v,我们为其分配一个地址,
那么对于u,我们如何查到这个地址呢?
这个问题引入了链式前向星中的head数组和next数组,
head[u]表示与结点u有连边的第一个点的地址id
而next数组更像是一个指针,对于next[id]令其指向下一个和u有连边的地址
在这个地址上,我们只要存储和u相连的是哪个点v即可
代码如下:
procedure add(u,v:longint);//加入一条从u连向v的有向边
begin
inc(tot);//分配地址
next[tot]:=head[u]; head[u]:=tot; vet[tot]:=v;//链表的插入
end;
那么我们如何实现dfs呢
procedure dfs(id:longint);
var point:longint;
begin
point:=head[id];
while point<>0 do //一直找下一个地址
begin
dfs(vet[point]);//深搜
point:=next[point];//跳到下一个地址
end;
end;
链式前向星就讲到这里了