标号法

标号法

    标号法是一种最适宜的算法,更常用于找寻图的最短手段和财力成绩。

    一、标号法的设想:

     同一事物标号,对应于图的每个顶峰的图形。。标号法可以应该静态布局,采取促进的方式。,检测图的全部边。,无反复回溯搜索,到这程度标号法是一种最适宜的算法。

    二、标号法的算法手续:

     现存的天体图G,寻摸没有的Vs到起点Ve的最短间隔。设:

     和(j)───顶峰Vj的标号,代表是VsVj的最短间隔。

     Vj有香味的VsVj计算了该手段和财力的最短手段和财力和程度。。

     M(i,j)───ViVj非负程度。

     H(j)───顶峰Vj前向装满。标号法的算法手续如次:

               
sum
s)←0

                  

              
Vs
进入队列L

                  
     

 
—–
自由的队列L的队首Vk—–

 |                
                                 
|

 |          Vk无论Ve——————|—计算完毕邮票手段和财力

 |             
N
  Y                            
|

 |                
                                 
|

 |           Vk推广装满Vj           
|

 |          VkVj衔接的)        
|

 |           
Sj
Sum(k)+M(kj)         |

 |                    
                             
|

 |              
Sj
没有Sumj            
|

 |                      
|                              
|

 |              
Y     |    N                       
|

 |                     
|    
——————–

 |                     
|

 |                   

 |          Sumj)←Sj

 |           Hj)← Vk

 |       Vj衔接队列L队列LSum从小到大的使丧失排序

 |                   

 
—————

当心:1.但是两个顶峰当说话中肯间隔埋怨负的。,才便于使用的标号法。 2.但是队列的第最初装满是物镜装满。,我们的可以终止计算。。用以表现威胁,它不确定的是最好的receiver 收音机。。

三、举例解析:

 
   1.
接界序列(GDOI97四题)

    成绩表现:

     当作最初N*N(<=100)无符号完整的矩阵M,在与在M[A1B1] 开端到M[A2B2]完毕的接界序列.两个展现M[IJ]M[KL]毗连比例是其次的合格证书经过。:

(1)I=K+-1J=L

     (2)I=KJ=L+-1

     苦差事:文档出口矩阵M,重读K(K<=4)M[A1B1]M[A2B2]的值。每组M[A1B1]M[A2B2],求一接界序列,毗连展现I的差值的绝对的积和。

     出口体式:

     4 ───N

     1 9 6 12 ───每行N个知识,共N

     8 7 3 5

     5 9 11 11

     7 3 2 6

     2 ───K

     4 1 1 4 ───表现A1,B1A2,B2的值,共K 2 2 3 4

     出口体式:

    1 17 差值绝对的积和的最低的17

     7 5 8 7 9 6 12───最初组知识的接界序列

     2 4

     7 9 11 11

     解析:万一两个毗连的数被对待两个顶峰,,两个数字当说话中肯差值的绝对的是特有的的。,成绩转变为两个顶峰的最短手段和财力。。设:乞和,J]从起源Vs到装满M[I,J]的最短间隔。 H[I,J]记载装满M[I,J]前向装满。 L队列来记载要推广的装满。因排序时数字组比较慢,因而用链表作为记载装满的队列的典型,恳求排序。

     介绍人顺序:

Program gdoi974;

const 方阵 [1..4,1..2] of integer
=((-1,0),(0,-1),(1,0),(0,1));

{这四分染色体公开左右打谷。}

type

{明确POINT典型,内脏X,Y矩阵中装满的被归入同一类别,NEXT作为队列说话中肯经营装满}

    point=^note;

    note=record

         x,音节:

         下一步:点

         end;

var

    和:数字组 [1..100,1..100] of integer;

    M:数字组 [1..100,1..100] of integer;

    H:数字组 [1..100,1..100,1..2] of byte;

    f1,F2:原文

    a,b,x1,y1,x2,y2,n,k,ZZ:完整的

procedure print;

var

    a,b,x,y,x3,y3:integer;

    C:数字组 [1..100] of integer;

    手势:乔治英国数学家和逻辑学家

begin

     手势:=真 A:=1 C[a]:= M[X2 ],y2];

     x= x2 y:=y2;

     while flag do

     begin

          a:=a+1;
x3:=x y3:=y;

         
x:=h[x3,y3,1]; y:=h[x3,y3,2];

         
c[a]:=m[x,y];

          if (x=x1)
and (y=y1) then 手势:=假

     end;   {找到总计达手段和财力。,列阵C}

     writeln (F2),zz,” ”,乞和〔X2〕,y2]);

     for B: = 向山下 1 do

     write (F2),c[b],” ”); {邮票奏效}

     writeln (F2));

end;

procedure 添加(X),y,I:整数;VaR L:点)

var

   e,f,G:点

   a,b,C:完整的

   手势:乔治英国数学家和逻辑学家

begin

     new (e);

     e^.x:=x; e^.y:=y;

     if i=0 then l^.next:=e {衔接队列}

     else begin

          f:=l;
g:=f^.next; 手势:=真

          for A:=1 to
i do

          begin

              
if sum[g^.x,Gy.y]>和(x),y] then begin

                
e^.next:=g; f^.next:=e; 手势:=假 答: {
衔接队列}

              
end;

              
f:=f^.next; g:=f^.next;

          end;

          if flag then
f^.next:=e; {
衔接队列}

          end;

end;

procedure 尝试(XZ),YZ:音节)

var

   a,b,c,sj,x,y,x1,y1:integer;

   e,l,V:点

   手势:乔治英国数学家和逻辑学家

begin

 
   fillchar
(和),sizeof (和)),255); {
Sum值为-1}

     乞和,YZ:=0定没有的Sum值为0}

     手势:=真

     new (e); e^.x:=xz; e^.y:=yz;

     new (l); l^.next:=e; {启动进入队列}

     c:=1; {如今队列装满的编号}

     while flag do

     begin

          v:=l^.next;
dispose (l); {
取出第最初装满。V}

          l:=v;
c:=c-1;{
将指状物向山下行动一位。,装满的编号缩减了最初。}

          x:=v^.x;
y:=v^.y;

          if (x=x2)
and (y=y2) then 手势:=假 {
万一目的装满,那时完毕计算。}

          if flag then

          begin

              
for A:=1 to 4 do  {
向四分染色体公开推广}

              
begin

                 
  x1:=x+fang[a,1];

                   
y1:=y+fang[a,2];

                   
if (X1)>0) and (X1)<=n) and (y1>0) and (y1<=n) then

                   
begin

                        
Sj==和,Y ABS (m[x,y]-m[x1,y1]);

                        
if (SJ) < 乞和〔X1〕,y1]) or (和)[x1,y1]=-1) then

                        
begin

                              
乞和〔X1〕,y1]:=sj;

                              
H[X1,y1,1]:=x; H[X1,y1,2]:=y;{
记载手段和财力}

                              
添加(X)1,y1,c,l); {
将新推广的装满出口队列中。}

                              
c:=c+1; {
装满数加1}

                        
end;

                   
end;

              
end;

         end;

     end;

     print;{邮票奏效}

end;

Begin

     assign (F1),””);

     assign (F2),””);

     reset (F1)); rewrite (F2));

     readln (F1),n);

     for A:=1 to n do

     begin

          for b:=1 to
n do

            
read (F1),M[A,b]);

          readln (F1));

     end; {读入数字组}

     readln (F1),k);

     for A:=1 to k do

     begin

          ZZ:=

          readln
(F1),x1,y1,x2,y2); {
读入苦差事}

          try(X1),y1);

     end;

     close(F1));

     close(F2));

End.

    四、小结

     简言之,标号法是静态布局的一种,采取促进的方式。,检测图的全部边。,无反复回溯搜索,这比普通的搜索说得来得多。。这是一种使最优化算法。。

     五、练习

     1.多米诺骨牌(GDSOI2000试试秒个成绩。)

     有多米诺骨牌小船等擦着水面疾驶。,后面分为两比例。,每个比例的承认是空的或空的。,或被贴上符号16个点。如今书部门用的上有一排多米诺骨牌。:

┏━━┓┏━━┓┏━━┓┏━━┓

┃┃┃┃

┣━━┫┣━━┫┣━━┫┣━━┫

┃┃┃┃

┗━━┛┗━━┛┗━━┛┗━━┛

     多米诺骨牌说话中肯点和6+1+1+1=9;多米诺骨牌多米诺数积和是1+5+3+2=11.上排与下排的分别是2这种背离是T和之差的绝对的。。全部Domino都可以干杯!逆叫。,即,形成顶部变得下部。,下部变得形成顶部。。如今的苦差事是。,最少周转次数,使顶行和底行当说话中肯差值最小。。

     当作前述的举例,我们的只需求翻转最近的最初多米诺骨牌。,您可以在顶部行和走行当中停止分别。0。因而左右举例的答案是1

     出口体式:

     知识回忆在“”中。文档的第当事人是完整的。n(1<=n<=1000),表现有n部门猛推着多米诺骨牌。。总有最初n行,每行组编两个完整的。ab(0<=ab<=6)。第i+1行的ab代表最初iDomino Domino的左右点。(0表现空)

     出口体式:

     知识出口到“”中。但是最初完整的。,翻转多米诺骨牌的最少次数。。

    出口出口探察:

出口文档:

4

6 1

1 5

1 3

1 2

出口文档:

1

发表评论

电子邮件地址不会被公开。 必填项已用*标注