??xml version="1.0" encoding="utf-8" standalone="yes"?>久久riav二区三区,亚洲男人天堂2023,婷婷精品在线http://www.aygfsteel.com/franlk/category/11465.htmlzh-cnFri, 02 Mar 2007 06:24:02 GMTFri, 02 Mar 2007 06:24:02 GMT60[转帖]十类法的详l说?/title><link>http://www.aygfsteel.com/franlk/articles/47795.html</link><dc:creator>FRANLK 的个人空?/dc:creator><author>FRANLK 的个人空?/author><pubDate>Wed, 24 May 2006 05:18:00 GMT</pubDate><guid>http://www.aygfsteel.com/franlk/articles/47795.html</guid><wfw:comment>http://www.aygfsteel.com/franlk/comments/47795.html</wfw:comment><comments>http://www.aygfsteel.com/franlk/articles/47795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/franlk/comments/commentRss/47795.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/franlk/services/trackbacks/47795.html</trackback:ping><description><![CDATA[十类法的详l说?<br />偶以赛题景来说明一下: <br />1、蒙特卡|算法: <br />在大多数建模赛题中都M开计算机的仿真Q随机性模拟是非常常见的算法之一?<br />举个例子是97q的A题,每个零g都有自己的标定|也都有自q容差{Q而求解最优的l合Ҏ要面对着的是一个极其复杂的公式?08U容差选取ҎQ根本不可能去解析求解的Q那如何L到最优的Ҏ呢?随机性模拟搜索最优方案就是其中的一U方法,在每个零件可行的区间中按照正态分布随机的选取一个标定值和选取一个容差gZU方案,然后通过蒙特卡罗法仿真出大量的ҎQ从中选取一个最佳的。另一个例子就是去q的彩票W二问,要求设计一U更好的ҎQ首先方案的优劣军_于很多复杂的因素Q同样不可能ȝZ个模型进行求解,只能靠随Z真模拟?<br />2、数据拟合、参C计、插值等法Q?<br />数据拟合在很多赛题中有应用,与图形处理有关的问题很多与拟合有关系Q一个例子就?8q美赛A题,生物l织切片的三l插值处理,94qA题逢山开路,׃h高度的插D,q有늚沸沸扬扬可能会考的非典问题也要用到数据拟合法Q观察数据的走向q行处理。此c问题在Matlab中有很多数据处理现成的函数可以调用,熟悉MatlabQ这些方法都能游刃有余的做好?<br />3、规划类问题法Q?<br />竞赛中很多问题都和数学规划有养I可以说不的模型都可以归lؓ一l不{式l作为约束条件、几个函数表辑ּ作ؓ目标函数的问题,遇到q类问题Q求解就是关键了Q比?8BQ用很多不等式完全可以把问题ȝ清楚Q因此列丑և规划后用Lindo、Lingo{Y件来q行解决比较方便Q所以还需要熟悉这两个软g?<br />4、图论问题: <br />98B?0B?5锁具装箱{问题体C图论问题的重要性,q类问题法有很多,包括QDijkstra、Floyd、Prim、Bellman-FordQ最大流Q二分匹配等问题。每一个算法认真的话都应该写一遍,否则到比赛时再写晚了, <br />5、计机法设计中的问题Q?<br />计算机算法设计包括很多内容:动态规划、回溯搜索、分ȝ法、分支定界。比?2B用分支定界法Q?7B是典型的动态规划问题,此外98B体现了分ȝ法。这斚w问题和acm中的问题cMQ推荐的书籍有《计机法设计与分析》电子工业出版社{与计算机算法有关的书?<br />6、最优化理论的三大非l典法Q?<br />模拟退火法、神l网l、遗传算法。这十几q来最优化理论有了飞速发展,q三cȝ法发展很快,q几q的赛题来复杂,很多问题没有什么很好的模型可以借鉴Q于是这三类法很多时候可以派上用场,比如Q?7A的模拟退火算法?0B的神l网l分cȝ法、象01Bq种N也可以用神l网l、还有美国竞?9A也和BP法有关p,当时?6q刚提出BP法Q?9q就考了Q说明赛题可能是当今前沿U技的抽象体现?3B伽马刀问题也是目前研究的课题,目前法最佳的是遗传算法?<br />7、网格算法和ID法 <br />|格法和穷举法一P只是|格法是q箋问题的穷举。比如要求在N个变量情况下的最优化问题Q那么可以对q些变量可取的空间进行采点,比如在[a,b]区间内取M+1个点Q就是在a、a+(b-a)/M、a+2*(b-a)/M、……、b那么q样循环需要进?M+1)^Nơ运,所以计量很大?<br />比如97qA题?9qB题都可以用网格法搜烦Q这U方法最好在q算速度叫快的计机中进行,q有要用高语言来做Q最好不要用Matlab做网|否则会算很久的。穷举法大家都熟悉,׃说了?<br />8、一些连l离散化Ҏ <br />大部分物理问题的~程解决Q都和这U方法有一定的联系Q物理问题是反映我们生活在一个连l的世界中,计算机求解只认离散的变量Q所以需要将q箋量进行离散处理,q种Ҏ应用很广Q大都和上面的很多算法有养I事实上,|格法、蒙特卡|算法、模拟退火都用了q个思想?<br />9、数值分析算?<br />q类法是针寚wU语a而专门设的,如果你用的是Matlab、MathematicaQ大可不必准备,因ؓ象数值分析中有很多函C般的数学工具是具备的?<br />10、图象处理算?<br />01A中需要你会读bmp图象?8赛A需要你知道三维插D,03B要求更高Q不但需要编E计还要进行处理,而数模论文中也有很多囄需要展C,因此图象处理是关键Q做好这c问题,重要的是把Matlab学好Q特别是图象处理的部分?<br /><br />模拟退火算法(转蝲Q?<br /><br />退火概忉|80q代初期研究l合优化问题时提出的Q该Ҏ解决优化问题 <br />的出发点是基于物理中Z物质的退火过E与一般组合优化问题之间的怼 <br />性。在对固体物质进行退火处理时Q通常是先它加温熔化Q其中的粒?<br />可以自由q动Q然后降温,_子逐渐形成低能态的晶体。如果凝l点附近 <br />温度下降_慢,那么Z物质一定能够Ş成最低能量的状态。模拟退火就 <br />是模拟了q一q程Q从而求得组合优化问题的全局Q近|最优解?<br /><br />------------------------------------------------- <br />发信? daniel (丹?, 信区: AI <br />?? 模拟退?2) <br />发信? 南大百合信息交换站 (Sun Apr 5 20:03:55 1998), 转信 <br /><br />设E[{xi}]表示某系l在微观状态{xi}Q{xi}Zl状态变量,如速度?<br />位置{)下的内能Q对于给定温度TQ如果系l处于热q状态,那么 <br />E[{xi}]服从Boltzmann分布Q分布函CؓQ?<br /><br />f = C(T)e^(-E[{xi}]/kT) <br />C(T)-1/(e^(-E[{x1}]/kT)+e^(-E[{x2}]/kT)+...+e^(-E[{xn}]/kT)) <br /><br />其中k是Boltzmann常数?<br /><br />T下降导致内能E下降Q如果T下降速度_慢,那么pȝ可以保持热 <br />qQ其内能在该温度下辑ֈ最低倹{当T=0Q开氏温度)Ӟ内能达?<br />最倹{这L降温q程是退火过E?<br /><br />------------------------------------------------- <br /><br />发信? daniel (丹?, 信区: AI <br />?? 模拟退?3) <br />发信? 南大百合信息交换站 (Sun Apr 5 20:04:45 1998), 转信 <br /><br />在退火过E中l常要用Metropolis抽样Q它可以用来模拟温度T下系l的 <br />热^衡?<br /><br />随机选一初始状态{xi}Q?然后随机地给pȝ加一个扰动{delta xi},?<br />内能增量为: <br /><br />delta E = E[{xi+delta xi}] - E[{xi}] <br /><br />如果delta E<0Q那么这个扰动就被接受Q否则该扰动按概率 <br />e^(-delta E/kT) 被接受。如果扰动被接受Q那么就用{xi+delta xi}代替 <br />原来的{xi}Q否则就产生一个新的扰?..... <br /><br />如此反复Q则{xi}逐渐满前述Boltzmann分布?<br /><br />如果让T从一个够大的值逐渐下降Q对于每个T都用Metropolis抽样?<br />pȝ热^衡,那么到T=0Ӟ实C模拟退火,E[{xi}]辑ֈ最倹{?<br /><br />------------------------------------------------- <br />发信? daniel (丹?, 信区: AI <br />?? 模拟退?4) <br />发信? 南大百合信息交换站 (Sun Apr 5 20:05:19 1998), 转信 <br /><br />计算机实现模拟退火的思想是:每U可能的l合状态作为{xi}QE作ؓ <br />目标函数QT作ؓ控制参数QoT逐渐减小?Q从而得到目标函数最优倹{?<br /><br />基本步骤为: <br /><br />初始化:对初始状态{xi}Q取初始值T(0)Q计目标函数E[{xi}]Q?<br />1. 产生随机扰动Q计delta E = E[{xi+delta xi}] - E[{xi}] <br />2. 若delta E<0, goto 4,否则产生[0Q?]上的一个均匀分布随机数yQ?<br />3. 若e^(-E/T)<=yQgoto 1 Q?<br />4. 用{xi+delta xi}代替{xi},E+delta E代替E; <br />5. 验Metropolis抽样是否E_Q若不稳定,goto 1; <br />6. T减小Q?<br />7. 是否满目标Q是则结束,否则goto 1?<br /><br />------------------------------------------------- <br /><br />发信? daniel (丹?, 信区: AI <br />?? 模拟退?5) <br />发信? 南大百合信息交换站 (Sun Apr 5 20:05:41 1998), 转信 <br /><br />模拟退火是否能辑ֈE的最值决定于T(0)是否_大,和T是否下降?<br />_慢,以及对于每个TQMetropolis抽样是否E_?<br /><br />模拟退火的典型特征是除了接受目标函数的改进外,q接受一个衰减极限, <br />当T较大Ӟ接受较大的衰减,当T逐渐减小Ӟ接受较小的衰减,当T? <br />Ӟ׃再接受衰减。这一特征意味着模拟退火与局部搜索相反,它能避开 <br />局部极,q且q保持了局部搜索的通用性和单性?<br /><br />值得注意的是Q当T?Ӟ模拟退火就成ؓ局部搜索的一个特?img src ="http://www.aygfsteel.com/franlk/aggbug/47795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/franlk/" target="_blank">FRANLK 的个人空?/a> 2006-05-24 13:18 <a href="http://www.aygfsteel.com/franlk/articles/47795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[摘录]一些基本算?http://www.aygfsteel.com/franlk/articles/47794.htmlFRANLK 的个人空?/dc:creator>FRANLK 的个人空?/author>Wed, 24 May 2006 05:15:00 GMThttp://www.aygfsteel.com/franlk/articles/47794.htmlhttp://www.aygfsteel.com/franlk/comments/47794.htmlhttp://www.aygfsteel.com/franlk/articles/47794.html#Feedback0http://www.aygfsteel.com/franlk/comments/commentRss/47794.htmlhttp://www.aygfsteel.com/franlk/services/trackbacks/47794.htmlhttp://vib.hit.edu.cn/vibbbs/dispbbs.asp?boardID=25&ID=2357&page=8

9.树的遍历序转换  

A. 已知前序中序求后序 ?
procedure Solve(pre,mid:string);  
var i:integer;  
begin  
    if (pre='') or (mid='') then exit;  
    i:=pos(pre[1],mid);  
    solve(copy(pre,2,i),copy(mid,1,i-1));  
    solve(copy(pre,i+1,length(pre)-i),copy(mid,i+1,length(mid)-i));  
    post:=post+pre[1]; {加上根,递归l束后post即ؓ后序遍历}  
end;    

B.已知中序后序求前序 ?
procedure Solve(mid,post:string);  
var i:integer;  
begin  
    if (mid='') or (post='') then exit;  
    i:=pos(post[length(post)],mid);  
    pre:=pre+post[length(post)]; {加上根,递归l束后pre即ؓ前序遍历}  
    solve(copy(mid,1,I-1),copy(post,1,I-1));  
    solve(copy(mid,I+1,length(mid)-I),copy(post,I,length(post)-i));  
end;    

C.已知前序后序求中序   ?
function ok(s1,s2:string):boolean;  
var i,l:integer;
    p:boolean;  
begin  
    ok:=true;  
    l:=length(s1);  
    for i:=1 to l do  
    begin  
        p:=false;  
        for j:=1 to l do  
        if s1[i]=s2[j] then p:=true;  
          if not p then  
          begin  
             ok:=false;exit;  
          end;  
        end;  
    end;    

procedure solve(pre,post:string);  
var i:integer;  
begin  
    if (pre='') or (post='') then exit;  
    i:=0;  
    repeat  
       inc(i);  
    until ok(copy(pre,2,i),copy(post,1,i));  
    solve(copy(pre,2,i),copy(post,1,i));  
    midstr:=midstr+pre[1];  
    solve(copy(pre,i+2,length(pre)-i-1),copy(post,i+1,length(post)-i-1));  
end;    

10.求图的弱q通子?DFS)  
procedure dfs ( now,color: integer);  
begin  
    for i:=1 to n do  
        if a[now,i] and c[i]=0 then  
        begin  
           c[i]:=color;  
           dfs(I,color);  
        end;  
end;    

12.q制转换  
A.整数L正整数进刉的互化   ?
NOIP1996数制转换  
讑֭W串A$的结构ؓ: A$='mp'  
其中m为数字串(长度&lt; =20),而n,p均ؓ1?位的数字?其中所表达的内容在2-10之间)
E序要求:从键盘上dA$?不用正确性检?,A$中的数字串m(nq制)以pq制的Ş式输?
例如:A$='48&lt; 10 &gt;8'   其意义ؓ:?0q制?8,转换?q制数输?  
输出l果:48&lt; 10 &gt;=60&lt; 8 &gt;    
B.实数L正整数进刉的互化 ?
C.负数q制Q ?NOIP2000   设计一个程序,d一个十q制数的基数和一个负q制数的基数Q?br />q将此十q制数{换ؓ此负 q制下的敎ͼ-R∈{-2Q?3Q?4,....-20}            

13.全排列与l合的生成 ?排列的生成:Q?..nQ ?
procedure solve(dep:integer);  
var   i:integer;  
begin  
      if dep=n+1 then
      begin
         writeln(s);
         exit;
      end;  
      for i:=1 to n do  
         if not used[i] then  
         begin  
            s:=s+chr(i+ord('0'));
            used[i]:=true;  
            solve(dep+1);  
            s:=copy(s,1,length(s)-1);
            used[i]:=false;  
         end;  
end;  

l合的生?1..n中选取k个数的所有方?  
procedure solve(dep,pre:integer);  
var   i:integer;  
begin  
      if dep=k+1 then
      begin
         writeln(s);
         exit;
      end;  
      for i:=1 to n do  
         if (not used[i]) and (i &gt;pre) then  
         begin  
             s:=s+chr(i+ord('0'));
             used[i]:=true;  
             solve(dep+1,i);  
             s:=copy(s,1,length(s)-1);
             used[i]:=false;  
         end;  
end;        

14 递推关系   计算字串序号模型   USACO1.2.5 StringSobits  
长度为N (N&lt; =31)?1串中1的个数小于等于L的串l成的集合中扑և按大排序后的第I?1丌Ӏ?br />数字划分模型
*NOIP2001数的划分
整数n分成k份,且每份不能ؓI,
L两种分法不能相同(不考虑序)?
d[0,0]:=1;
for p:=1 to n do
    for i:=p to n do
       for j:=k downto 1 do inc(d[i,j],d[i-p,j-1]);
           writeln(d[n,k]);
*变Ş1Q考虑序
d[ i, j] : = d [ i-k, j-1] (k=1..i)
*变Ş2Q若分解出来的每个数均有一个上限m
d[ i, j] : = d [ i-k, j-1] (k=1..m)

15.符优先法求解表辑ּ求值问?
const maxn=50;
var s1:array[1..maxn] of integer; {s1为数字栈}
    s2:array[1..maxn] of char; {s2为算W栈}
    t1,t2:integer; {栈顶指针}
procedure calcu;
var x1,x2,x:integer;
    p:char;
begin  
    p:=s2[t2];
    dec(t2);  
    x2:=s1[t1];
    dec(t1);  
    x1:=s1[t1];
    dec(t1);  
    case p of  
      '+':x:=x1+x2;  
      '-':x:=x1-x2;  
      '*':x:=x1*x2;  
      '/':x:=x1 div 2;  
    end;  
    inc(t1);
    s1[t1]:=x;
end;
procedure work;
var c:char;
    v:integer;
begin  
    t1:=0;
    t2:=0;  
    read(c);  
    while c&lt; &gt;';' do  
       case c of  
       '+','-':  
       begin  
           while (t2 &gt;0) and (s2[t2]&lt; &gt;'(') do calcu;  
               inc(t2);s2[t2]:=c;  
               read(c);  
       end ;  
       '*','/':  
       begin  
           if (t2 &gt;0) and ((s2[t2]='*') or (s2[t2]='/')) then calcu;  
           inc(t2);s2[t2]:=c;  
           read(c);  
       end;  
       '(':
       begin
           inc(t2);
           s2[t2]:=c;
           read(c);
       end;  
       ')':  
       begin  
           while s2[t2]&lt; &gt;
       '(' do calcu;  
           dec(t2);
           read(c);  
       end;  
       '0'..'9':  
       begin  
           v:=0;  
           repeat  
              v:=10*v+ord(c)-ord('0');  
              read(c);  
           until (c&lt; '0') or (c &gt;'9');  
           inc(t1);
           s1[t1]:=v;  
       end;  
      end;  
      while t2 &gt;0 do calcu;  
           writeln(s1[t1]);
end;

16.查找法  
折半查找  
function binsearch(k:keytype):integer;  
var low,hig,mid:integer;  
begin  
    low:=1;
    hig:=n;  
    mid:=(low+hig) div 2;  
    while (a[mid].key&lt; &gt;k) and (low&lt; =hig) do  
    begin  
         if a[mid].key &gt;k then hig:=mid-1  
         else low:=mid+1;  
              mid:=(low+hig) div 2;  
         end;  
         if low &gt;hig then mid:=0;  
            binsearch:=mid;  
end;    
树Ş查找  
?排序树:每个l点的值都大于其左子树Ml点的D小于其叛_树Q一l点的倹{ ?
查找  
function treesrh(k:keytype):pointer;  
var q:pointer;  
begin  
    q:=root;  
    while (q&lt; &gt;nil) and (q^.key&lt; &gt;k) do   if k&lt;
       q^.key then q:=q^.left   else q:=q^.right;  
    treesrh:=q;  
end;



]]>
[摘录]一些基本算?http://www.aygfsteel.com/franlk/articles/47793.htmlFRANLK 的个人空?/dc:creator>FRANLK 的个人空?/author>Wed, 24 May 2006 05:13:00 GMThttp://www.aygfsteel.com/franlk/articles/47793.htmlhttp://www.aygfsteel.com/franlk/comments/47793.htmlhttp://www.aygfsteel.com/franlk/articles/47793.html#Feedback0http://www.aygfsteel.com/franlk/comments/commentRss/47793.htmlhttp://www.aygfsteel.com/franlk/services/trackbacks/47793.htmlhttp://vib.hit.edu.cn/vibbbs/dispbbs.asp?boardID=25&ID=2357&page=8
1.数论法
求两数的最大公U数
function gcd(a,b:integer):integer;
begin
   if b=0 then gcd:=a
   else gcd:=gcd (b,a mod b);
end ;
求两数的最公倍数
function lcm(a,b:integer):integer;  
begin
   if a&lt; b then swap(a,b);
      lcm:=a;
   while lcm mod b &gt;
   0 do inc(lcm,a);
end;
素数的求?
A.范围内判断一个数是否敎ͼ  
function prime (n: integer): Boolean;
var I: integer;
begin
   for I:=2 to trunc(sqrt(n)) do
      if n mod I=0 then
      begin
         prime:=false; exit;
      end;  
   prime:=true;  
end;    
B.判断longint范围内的数是否ؓ素数Q包含求50000以内的素数表Q:  
procedure getprime;  
var i,j:longint;  
    p:array[1..50000] of boolean;  
begin  
    fillchar(p,sizeof(p),true);  
    p[1]:=false;  
    i:=2;  
    while i&lt; 50000 do  
    begin  
       if p[i] then  
       begin  
          j:=i*2;  
          while j&lt; 50000 do  
          begin  
             p[j]:=false;  
             inc(j,i);  
          end;  
       end;  
       inc(i);  
    end;  
    l:=0;  
    for i:=1 to 50000 do  
       if p[i] then  
       begin  
          inc(l);  
          pr[l]:=i;  
       end;  
    end;{getprime}
  
function prime(x:longint):integer;  
var i:integer;  
begin  
    prime:=false;  
    for i:=1 to l do  
        if pr[i] &gt;=x then break  
        else if x mod pr[i]=0 then exit;  
        prime:=true;  
end;{prime}
  
2.3.4.求最生成树  
A.Prim法Q ?
procedure prim(v0:integer);  
var lowcost,closest:array[1..maxn] of integer;  
    i,j,k,min:integer;  
begin  
    for i:=1 to n do  
    begin  
        lowcost[i]:=cost[v0,i];  
        closest[i]:=v0;  
    end;  
    for i:=1 to n-1 do  
    begin   {Lȝ成树最q的未加入顶点k}  
        min:=maxlongint;  
        for j:=1 to n do  
           if (lowcost[j]&lt; min) and (lowcost[j]&lt; &gt;0) then  
           begin  
              min:=lowcost[j];  
              k:=j;  
           end;  
        lowcost[k]:=0; {顶点k加入生成树}  
     {生成树中增加一条新的边k到closest[k]}  
     {修正各点的lowcost和closest值}  
     for j:=1 to n do  
         if cost[k,j]&lt; lwocost[j] then  
         begin  
            lowcost[j]:=cost[k,j];  
            closest[j]:=k;  
         end;  
     end;  
end;{prim}

B.Kruskal法Q?贪心)
    按权值递增序删去图中的边Q若不Ş成回路则此边加入最生成树?
function find(v:integer):integer; {q回点v所在的集合}
var i:integer;
begin  
    i:=1;  
    while (i&lt; =n) and (not v in vset[i]) do inc(i);  
         if i&lt; =n then find:=i   else find:=0;
end;

procedure kruskal;
var tot,i,j:integer;
begin  
   for i:=1 to n do vset[i]:=[i];{初始化定义n个集合,WI个集合包含一个元素I}  
       p:=n-1; q:=1; tot:=0; {p为尚待加入的ҎQq集指针}  
       sort;  
   {Ҏ有边按权值递增排序Q存于e[i]中,e[i].v1与e[i].v2I所q接的两个顶点的序号Qe[i].len为第I条边的长度}  
   while p &gt;0 do  
   begin  
       i:=find(e[q].v1);
       j:=find(e[q].v2);  
       if i&lt; &gt;j then  
       begin  
          inc(tot,e[q].len);  
          vset[i]:=vset[i]+vset[j];
          vset[j]:=[];  
          dec(p);  
       end;  
       inc(q);  
   end;  

5.最短\径 ?

A.标号法求解单源点最短\径:  
var   a:array[1..maxn,1..maxn] of integer;  
      b:array[1..maxn] of integer; {b[i]指顶点i到源点的最短\径}  
      mark:array[1..maxn] of boolean;    
procedure bhf;  
var   best,best_j:integer;  
begin  
      fillchar(mark,sizeof(mark),false);  
      mark[1]:=true;
      b[1]:=0;{1为源点}  
      repeat   best:=0;  
      for i:=1 to n do  
          If mark[i] then {Ҏ一个已计算出最短\径的点}  
          for j:=1 to n do  
              if (not mark[j]) and (a[i,j] &gt;0) then  
                  if (best=0) or (b[i]+a[i,j]&lt; best) then  
                  begin  
                      best:=b[i]+a[i,j]; best_j:=j;  
                  end;  
                  if best &gt;0 then  
                  begin  
                      b[best_j]:=best;
                      mark[best_j]:=true;  
                  end;  
     until best=0;  
end;{bhf}    

B.Floyed法求解所有顶点对之间的最短\径:  
procedure floyed;  
begin  
   for I:=1 to n do  
       for j:=1 to n do  
           if a[I,j] &gt;0 then
              p[I,j]:=I else p[I,j]:=0;  
              {p[I,j]表示I到j的最短\径上j的前q点}  
              for k:=1 to n do {枚D中间l点}  
                  for i:=1 to n do   for j:=1 to n do  
                      if a[i,k]+a[j,k]&lt; a[i,j] then  
                      begin  
                         a[i,j]:=a[i,k]+a[k,j];  
                         p[I,j]:=p[k,j];  
                      end;  
end;

C. Dijkstra 法Q?
cM标号法,本质心算法?
var a:array[1..maxn,1..maxn] of integer;
    b,pre:array[1..maxn] of integer; {pre[i]指最短\径上I的前q点}
    mark:array[1..maxn] of boolean;
procedure dijkstra(v0:integer);
begin  
    fillchar(mark,sizeof(mark),false);  
    for i:=1 to n do  
    begin  
        d[i]:=a[v0,i];  
        if d[i]&lt; &gt;0 then
           pre[i]:=v0
        else
           pre[i]:=0;  
    end;  
    mark[v0]:=true;  
    repeat {每@环一ơ加入一个离1集合最q的l点q调整其他结点的参数}  
        min:=maxint;
        u:=0; {u记录?集合最q的l点}  
        for i:=1 to n do  
            if (not mark[i]) and (d[i]&lt; min) then  
            begin  
               u:=i; min:=d[i];  
            end;  
            if u&lt; &gt;0 then  
            begin  
               mark[u]:=true;  
               for i:=1 to n do  
                   if (not mark[i]) and (a[u,i]+d[u]&lt; d[i]) then  
                   begin  
                      d[i]:=a[u,i]+d[u];  
                      pre[i]:=u;  
                   end;  
               end;  
     until u=0;
end;

D.计算囄传递闭?
Procedure Longlink;
Var T:array[1..maxn,1..maxn] of boolean;
Begin  
    Fillchar(t,sizeof(t),false);  
    For k:=1 to n do  
        For I:=1 to n do  
            For j:=1 to n do  
                T[I,j]:=t[I,j] or (t[I,k] and t[k,j]);
End;  

7.排序法  

A.快速排序:  
procedure sort(l,r:integer);  
var i,j,mid:integer;  
begin  
    i:=l;j:=r;
    mid:=a[(l+r) div 2];  
    {当前序列在中间位置的数定义Z间数}  
    repeat  
    while a[i]&lt; mid do inc(i); {在左半部分寻找比中间数大的数}  
    while mid&lt; a[j] do dec(j);{在右半部分寻找比中间数小的数}  
    if i&lt; =j then  
    begin {若找Cl与排序目标不一致的数对则交换它们}  
       swap(a[i],a[j]);  
       inc(i);
       dec(j); {l箋找}  
    end;  
    until i &gt;j;  
    if l&lt; j then
       sort(l,j); {若未C个数的边界,则递归搜烦左右区间}  
    if i&lt; r then sort(i,r);  
end;{sort}

B.插入排序Q?

procedure insert_sort(k,m:word); {k为当前要插入的数Qm为插入位|的指针}
var i:word; p:0..1;
begin  
    p:=0;  
    for i:=m downto 1 do  
        if k=a[i] then exit;  
        repeat   If k &gt;a[m] then  
                 begin  
                    a[m+1]:=k; p:=1;  
                 end  
                 else  
                 begin  
                    a[m+1]:=a[m];
                    dec(m);  
                 end;  
        until p=1;
end;{insert_sort}  
l ȝ序中为:  
   a[0]:=0;  
   for I:=1 to n do insert_sort(b[i],I-1);    

C.选择排序Q ?
procedure sort;  
var i,j,k:integer;  
begin  
     for i:=1 to n-1 do  
     begin  
         k:=i;  
         for j:=i+1 to n do  
            if a[j]&lt; a[k] then
               k:=j; {扑ևa[i]..a[n]中最的Ca[i]作交换}  
               if k&lt; &gt;i then  
               begin  
                  a[0]:=a[k];
                  a[k]:=a[i];
                  a[i]:=a[0];  
               end;  
     end;  
end;    

D. 冒排序  
procedure sort;  
var i,j,k:integer;  
begin  
    for i:=n downto 1 do  
        for j:=1 to i-1 do  
            if a[j] &gt;a[i] then  
            begin  
               a[0]:=a[i];
               a[i]:=a[j];
               a[j]:=a[0];  
            end;  
end;    

E.堆排序:  
procedure sift(i,m:integer);{调整以i为根的子树成为堆,m为结ҎL}  
var k:integer;  
begin  
    a[0]:=a[i];
    k:=2*i;{在完全二*树中l点i的左孩子?*i,叛_子ؓ2*i+1}  
    while k&lt; =m do  
    begin  
        if (k&lt; m) and (a[k]&lt; a[k+1]) then inc(k);{扑ևa[k]与a[k+1]中较大值}  
        if a[0]&lt; a[k] then  
        begin  
           a[i]:=a[k];
           i:=k;
           k:=2*i;  
        end  
        else
           k:=m+1;  
        end;  
        a[i]:=a[0]; {根攑֜合适的位置}  
end;

procedure heapsort;
var j:integer;
begin  
    for j:=n div 2 downto 1 do sift(j,n);  
        for j:=n downto 2 do  
        begin  
            swap(a[1],a[j]);  
            sift(1,j-1);  
        end;
end;

F. 归ƈ排序
{a为序列表Qtmp助数l}
procedure merge(var a:listtype; p,q,r:integer);
{已排序好的子序列a[p..q]与a[q+1..r]合ƈ为有序的tmp[p..r]}
var I,j,t:integer;
    tmp:listtype;
begin  
    t:=p;
    i:=p;
    j:=q+1;{t为tmp指针QI,j分别为左叛_序列的指针}  
    while (t&lt; =r) do  
    begin  
       if (i&lt; =q){左序列有剩余} and ((j &gt;r) or (a[i]&lt; =a[j])) then  {满取左边序列当前元素的要求}  
       begin  
          tmp[t]:=a[i]; inc(i);  
       end  
       else  
       begin  
          tmp[t]:=a[j];
          inc(j);  
       end;  
       inc(t);  
    end;  
    for i:=p to r do a[i]:=tmp[i];
end;{merge}

procedure merge_sort(var a:listtype; p,r: integer); {合ƈ排序a[p..r]}
var q:integer;
begin  
    if p&lt; &gt;r then  
    begin  
       q:=(p+r-1) div 2;  
       merge_sort (a,p,q);  
       merge_sort (a,q+1,r);  
       merge (a,p,q,r);  
    end;
end;
{main}
begin  
    merge_sort(a,1,n);
end.


   writeln(tot);
end;      



]]>
վ֩ģ壺 Ӷ| | | ʳ| | | | | ɽ| | ʯ| Ͷ| ϴ| | ٤ʦ| Ҧ| Ԫ| | ԭ| Ͽ| | ˮ| | | | | żҴ| | | | | ȷ| | | ӽ| »| ͨ| | °| | ̨|