标号法

标号法

    标号法是一种最适宜资格算法,更常用于找寻图的最短航线成绩。

    一、标号法的乐句:

     同样的标号,对应于图的每个顶峰的图形。。标号法可以应该静态工程,采取促进的办法。,检测图的全部边。,无反复回溯搜索,因而标号法是一种最适宜资格算法。

    二、标号法的算法垂:

     持续在详细规划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));

{这4态度左右意外的挫折。}

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  {
向4态度生长}

              
begin

                 
  X1: = X 方[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

发表评论

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