基本算法(转)_第1页
基本算法(转)_第2页
基本算法(转)_第3页
基本算法(转)_第4页
基本算法(转)_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基本算法(转)基本算法(转) (转自 中国开发者联盟)基本算法            1.数论算法      求两数的最大公约数      function gcd(a,b:integer):integer;      begin           if b=0 then gc

2、d:=a          else gcd:=gcd (b,a mod b);      end ;            求两数的最小公倍数      function lcm(a,b:integer):integer;      begin     &#

3、160;     if a< b then swap(a,b);           lcm:=a;           while lcm mod b >0 do inc(lcm,a);      end;        &#

4、160;   素数的求法      A.小范围内判断一个数是否为质数:      function prime (n: integer): Boolean;      var I: integer;      begin           for I:=2 to trunc(sqrt(n) do  

5、0;             if n mod I=0 then                begin                   

6、60;  prime:=false; exit;                end;           prime:=true;      end;            B.判断longint

7、范围内的数是否为素数(包含求50000以内的素数表):      procedure getprime;      var       i,j:longint;      p:array1.50000 of boolean;      begin           fillch

8、ar(p,sizeof(p),true);           p1:=false;           i:=2;           while i< 50000 do           

9、begin                if pi then                begin                   

10、;  j:=i*2;                     while j< 50000 do                     begin   

11、                       pj:=false;                          inc(j,i); &

12、#160;                   end;                end;                i

13、nc(i);          end;          l:=0;          for i:=1 to 50000 do               if pi then    &

14、#160;          begin                    inc(l);                   prl:

15、=i;               end;      end;getprime      function prime(x:longint):integer;      var i:integer;      begin       &#

16、160;   prime:=false;           for i:=1 to l do               if pri >=x then break              

17、 else if x mod pri=0 then exit;           prime:=true;      end;prime            2            3      

18、;            4.求最小生成树      A.Prim算法:      procedure prim(v0:integer);      var      lowcost,closest:array1.maxn of integer;      i,j,k,min:intege

19、r;      begin           for i:=1 to n do               begin                 

20、60;  lowcosti:=costv0,i;                    closesti:=v0;               end;          

21、0;for i:=1 to n-1 do           begin                寻找离生成树最近的未加入顶点k                min:=maxlongint;  

22、0;             for j:=1 to n do                if (lowcostj< min) and (lowcostj< >0) then             

23、;   begin                     min:=lowcostj;                     k:=j;    &

24、#160;           end;                lowcostk:=0; 将顶点k加入生成树                生成树中增加一条新的边k到closestk   &#

25、160;            修正各点的lowcost和closest值                for j:=1 to n do                if costk,j< lwoco

26、stj then                begin                      lowcostj:=costk,j;           

27、           closestj:=k;                end;          end;      end;prim B.Kruskal算法:(贪心) 按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树

28、。 function find(v:integer):integer; 返回顶点v所在的集合 var i:integer; begin     i:=1;     while (i< =n) and (not v in vseti) do inc(i);     if i< =n then find:=i     else find:=0; end; procedure kruskal; var tot,i,j:intege

29、r; begin      for i:=1 to n do vseti:=i;初始化定义n个集合,第I个集合包含一个元素I      p:=n-1; q:=1; tot:=0; p为尚待加入的边数,q为边集指针      sort;      对所有边按权值递增排序,存于eI中,eI.v1与eI.v2为边I所连接的两个顶点的序号,eI.len为第I条边的长度      while p >0

30、 do      begin           i:=find(eq.v1);j:=find(eq.v2);           if i< >j then           begin     

31、0;          inc(tot,eq.len);                vseti:=vseti+vsetj;vsetj:=;                dec(p);    &#

32、160;      end;           inc(q);      end;      writeln(tot); end;                  5.最短路径  

33、60;   A.标号法求解单源点最短路径:      var      a:array1.maxn,1.maxn of integer;      b:array1.maxn of integer; bi指顶点i到源点的最短路径      mark:array1.maxn of boolean;           

34、procedure bhf;      var      best,best_j:integer;      begin           fillchar(mark,sizeof(mark),false);           mark1:=true; b1:=0;1为源点

35、          repeat                best:=0;                for i:=1 to n do       &

36、#160;        If marki then 对每一个已计算出最短路径的点                     for j:=1 to n do               &#

37、160;          if (not markj) and (ai,j >0) then                                if (best=0) o

38、r (bi+ai,j< best) then                               begin               

39、0;                    best:=bi+ai,j; best_j:=j;                           &

40、#160;   end;                          if best >0 then                   

41、       begin                               bbest_j:=best;markbest_j:=true;        

42、60;                 end;           until best=0;      end;bhf            B.Floyed算法求解所有顶点对之间的最短路径: &

43、#160;    procedure floyed;      begin           for I:=1 to n do                for j:=1 to n do         

44、            if aI,j >0 then pI,j:=I else pI,j:=0;                     pI,j表示I到j的最短路径上j的前驱结点        

45、60;  for k:=1 to n do 枚举中间结点                for i:=1 to n do                     for j:=1 to n do    

46、0;                     if ai,k+aj,k< ai,j then                          begin

47、                               ai,j:=ai,k+ak,j;                  

48、             pI,j:=pk,j;                          end;       end; C. Dijkstra 算法: 类似标

49、号法,本质为贪心算法。 var a:array1.maxn,1.maxn of integer; b,pre:array1.maxn of integer; prei指最短路径上I的前驱结点 mark:array1.maxn of boolean; procedure dijkstra(v0:integer); begin      fillchar(mark,sizeof(mark),false);      for i:=1 to n do       

50、;    begin                di:=av0,i;                if di< >0 then prei:=v0 else prei:=0;        &#

51、160;  end;      markv0:=true;      repeat 每循环一次加入一个离1集合最近的结点并调整其他结点的参数           min:=maxint; u:=0; u记录离1集合最近的结点           for i:=1 to n do  

52、0;             if (not marki) and (di< min) then                begin                     u:=i; min:=di;           

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论