文档介绍: gcd(a,b:integer):integer;begin ifb=0thengcd:=a  elsegcd:=gcd(b,amodb);end; lcm(a,b:integer):integer;begin ifa<bthenswap(a,b); lcm:=a; whilelcmmodb>0doinc(lcm,a);end;:functionprime(n:integer):Boolean; varI:integer; begin  forI:=2totrunc(sqrt(n))do   ifnmodI=0thenbegin prime:=false;exit;end;  prime:=true; end;(包含求50000以内的素数表): proceduregetprime;  var   i,j:longint;   p:array[1..50000]ofboolean;   begin    fillchar(p,sizeof(p),true);p[1]:=false;i:=2;whilei<50000dobegin ifp[i]thenbegin  j:=i*2;  whilej<50000dobegin   p[j]:=false;   inc(j,i);  end;  end;  inc(i); end; l:=0; fori:=1to50000do  ifp[i]thenbegin   inc(l);pr[l]:=i; end;end;{getprime}   functionprime(x:longint):integer;   vari:integer;   begin    prime:=false;fori:=1toldo ifpr[i]>=xthenbreak  elseifxmodpr[i]=0thenexit;prime:=true;   end;{prime}二、:  procedureprim(v0:integer);   var    lowcost,closest:array[1..maxn]ofinteger;i,j,k,min:integer;   begin    fori:=1tondobegin lowcost[i]:=cost[v0,i]; closest[i]:=v0; end;fori:=1ton-1dobegin {寻找离生成树最近的未加入顶点k} min:=maxlongint; forj:=1tondo  if(lowcost[j]<min)and(lowcost[j]<>0)thenbegin   min:=lowcost[j];   k:=j;  end; lowcost[k]:=0;{将顶点k加入生成树}   {生成树中增加一条新的边k到closest[k]} {修正各点的lowcost和closest值} forj:=1tondo  if cost[k,j]<lwocost[j]thenbegin   lowcost[j]:=cost[k,j];   closest[j]:=k;  end; end;end;{prim}:(贪心)按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。functionfind(v:integer):integer;{返回顶点v所在的集合}vari:integer;begin i:=1; while(i<=n)and(notvinvset[i])doinc(i); ifi<=nthenfind:=ielsefind:=0;end;procedurekruskal;var tot,i,j:integer;begin fori:=1tondovset[i]:=[i];{初始化定义n个集合,第I个集合包含一个元素I}p:=n-1;q:=1;tot:=0;{p为尚待加入的边数,q为边集指针}sort;{对所有边按权值递增排序,存于e[I]中,e[I].v1与e[I].v2为边I所连接的两个顶点的序号,e[I].len为第I条边的长度} whilep>0dobegin  i:=find(e[q].v1);j:=find(e[q].v2);  ifi<>jthenbegin   inc(tot,e[q].len);   vset[i]:=vset[i]+vset[j];vset[j]:=[];   dec(p);  end;  inc(q); end; writeln(tot);end;