• 大规模图的存储(前向星、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.
  • 相关阅读:
    Memcached源码分析之memcached.h
    Memcached源码分析之请求处理(状态机)
    Memcached源码分析之线程模型
    Memcached源码分析之从SET命令开始说起
    Memcached源码分析
    jqgrid 获取当前页码
    CSS 居中大全【转】
    判断浏览器是否IE10
    jQuery.validate的this.optional(element)作用
    Java中static、final用法小结
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346278.html
Copyright © 2020-2023  润新知