大规模图的存储(前向星、next数组)

大规模图的储存
在信息学中,经常会遇到比较大规模图,使用指针固然是很好的方法,不过一有指针速度不如数组之说,二有指针不如数组稳定之说,三有,也是最重要的,指针不如数组来得方便,这也便是大多数Oier不愿意用指针的缘由了,但若遇到大规模的图(或者树)又如何是好呢?先不说邻接矩阵的储存问题,就是速度也成问题。
下面,就总结一下一些常用的,个人认为比较实用的用数组替代指针的方法:前向星与next数组
可以看到,相对于点来说,边是很少的,也就是说是一个稀疏图,肯定不能用邻接矩阵,只能从存边的角度考虑(u,v,w:array[1..maxm] of longint;)关键是如何能够快速的利用。
前向星是一种容易想到的方法:增加left:array[1..maxn] of longint;用left[i]来保存每个从i节点出发的边集的起始位置。再将数组按照u排序,然后一个线形扫描就可以得出所有left和right。


readln(n,m);
for i:=1 to m do readln(u[i],v[i],w[i]);
sort(u,1,m);
u[0]:=0;
for i:=m downto 1 do
begin
  for j:=  u[i-1]+1 to u[i] 
  left[j]:=i;
end;


{===========================================}


next数组是一种更为简洁,并且更为快速的方法。增加point:array[1..maxn] of longint;和next:array[1..maxm] of longint;point[i]表示第一条i节点出发的边的位置,next[i]表示i这一条边的下一条兄弟边(即同属于i出发)的位置。代码更简单:


readln(n,m);
for i:=1 to m do begin
readln(u,v[i],w[i]);
next[i]:=point[u];
point[u]:=i;
end;
k
p:=point[k];
while p<>0 do
begin
  if (f(v[p])=false) and ((dist[k]+w[p])<dist[v[p]]) then
     dist[v[p]]:=dist[k]+w[p];
  p:=next[p];
end
  
{===========================================}
——It's a lonely path. Don't make it any lonelier than it has to be.
原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346278.html