存图利器——链式前向星

存图的各种数据结构,复杂如下

邻接矩阵    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;

链式前向星就讲到这里了

 

posted @ 2018-10-19 15:16  by_wang  阅读(384)  评论(0)    收藏  举报
Live2D