1、0 do inc(lcm,a); end; 素数的求法 A.小范围内判定一个数是不是为质数: function prime (n: integer): Boolean; var I: integer; for I:=2 to trunc(sqrt(n) do if n mod I=0 then begin prime:=false; exit;=true; B.判定longint范围内的数是不是为素数(包括求50000之内的素数表): procedure getprime; var i,j:longint; p:array1.50000 of boolean; fillchar(p,sizeo
2、f(p),true); p1: i:=2; while i 50000 do begin if pi then begin j:=i*2; while j=x then break else if x mod pri=0 then exit;prime 2 3 算法: procedure prim(v0:integer); var lowcost,closest:array1.maxn of integer; i,j,k,min:=1 to n do begin lowcosti:=costv0,i; closesti:=v0;=1 to n-1 do begin 寻觅离生成树最近的未加入极点
3、k min:=maxlongint; for j:=1 to n do if (lowcostj min) and (lowcostj0) then begin=lowcostj; k:=j; lowcostk: 将极点k加入生成树 生成树中增加一条新的边k到closestk 修正各点的lowcost和closest值 if costk,j lwocostj then begin lowcostj:=costk,j; closestj:=k;prim(贪婪) 按权值递增顺序删去图中的边,假设不形成回路那么将此边加入最小生成树。 function find(v: 返回极点v所在的集合=1; wh
4、ile (i =n) and (not v in vseti) do inc(i); if i0 do begin=find(eq.v1);j:=find(eq.v2);j then begin inc(tot,eq.len); vseti:=vseti+vsetj;vsetj:=; dec(p); inc(q); writeln(tot); A.标号法求解单源点最短途径: a:array1.maxn,1.maxn of integer; b: bi指极点i到源点的最短途径 mark:array1.maxn of boolean; procedure bhf; best,best_j: fil
5、lchar(mark,sizeof(mark),false); mark1: b1:1为源点 repeat best: If marki then 对每一个已计算出最短途径的点 if (not markj) and (ai,j 0) then if (best=0) or (bi+ai,j0 then begin bbest_j:=best;markbest_j: until best=0;bhf 算法求解所有极点对之间的最短途径: procedure floyed; if aI,j 0 then pI,j:=I else pI,j: pI,j表示I到j的最短途径上j的前驱结点 for k:=
6、1 to n do 列举中间结点 if ai,k+aj,k ai,j then begin ai,j:=ai,k+ak,j; pI,j:=pk,j; C. Dijkstra 算法: 类似标号法,本质为贪婪算法。 b,pre: prei指最短途径上I的前驱结点 procedure dijkstra(v0: di:=av0,i; if di0 then prei:=v0 else prei: markv0: repeat 每循环一次加入一个离1集合最近的结点并调整其他结点的参数=maxint; u: u记录离1集合最近的结点 if (not marki) and (di min) then begin=di; if u marku: if (not marki) and (au,i+du di) then begin=au,i+du; prei:=u; until u=0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1