最近公共祖先 lca (留个坑,以后记得补!!!)

声明

  咳咳,进入重难点的图论算法之一(敲黑板):

  题目: 洛谷 P3379

  先放标程,以后补坑!!!(实在太难,一个模板这么长,注释都打半天,思维过程和算法讲解又打一堆,能用到此模板的都至少 省选+  了,但这个又不能因为懒而不打,毕竟要复习)

    

   
 1 var
 2         rmq:array[0..1000001,0..21] of longint;
 3         first,next,en,one,b:array[0..2000001] of longint;
 4         deep,a:array[0..10000001] of longint;
 5         i,j,k,m,n,s,t,l,r:longint;
 6 procedure add(k,x,y:longint);
 7 begin
 8         next[k]:=first[x];
 9         first[x]:=k;
10         en[k]:=y;
11 end;
12 procedure getrmq;
13 begin
14         for i:=1 to k do
15                 rmq[i,0]:=i;
16         for j:=1 to 20 do
17                 for i:=1 to k do
18                         if i+(1<<j)-1<=k then
19                                 if deep[rmq[i,j-1]]<deep[rmq[i+(1<<(j-1)),j-1]]
20                                         then rmq[i,j]:=rmq[i,j-1]
21                                                 else rmq[i,j]:=rmq[i+(1<<(j-1)),j-1];
22 end;
23 function que:longint;
24 begin
25         t:=trunc(ln(r-l+1)/ln(2));
26         if deep[rmq[l,t]]<deep[rmq[r-(1<<t)+1,t]] then exit(a[rmq[l,t]])
27                 else exit(a[rmq[r-(1<<t)+1,t]]);
28 end;
29 procedure dfs(x,y:longint);
30 var
31         t:longint;
32 begin
33         inc(k);
34         deep[k]:=y;
35         b[x]:=1;
36         a[k]:=x;
37         t:=first[x];
38         while t>0 do
39         begin
40                 if b[en[t]]=0 then
41                 begin
42                         dfs(en[t],y+1);
43                         inc(k);
44                         a[k]:=x;
45                         deep[k]:=y;
46                 end;
47                 t:=next[t];
48         end;
49         b[x]:=0;
50 end;
51 begin
52         readln(n,m,s);
53         for i:=1 to n-1 do
54         begin
55                 readln(j,k);
56                 add(i*2-1,j,k);
57                 add(i*2,k,j);
58         end;
59         k:=0;
60         dfs(s,1);
61         for i:=1 to k do
62                 if b[a[i]]=0 then
63                 begin
64                         one[a[i]]:=i;
65                         b[a[i]]:=1;
66                 end;
67         getrmq;
68         for i:=1 to m do
69         begin
70                 readln(j,k);
71                 l:=one[j];
72                 r:=one[k];
73                 if l>r then
74                 begin
75                         j:=l;
76                         l:=r;
77                         r:=j;
78                 end;
79                 writeln(que);
80         end;
81 end.
标程

  放了标程后光速逃~~~  (有(bu)时(ke)间(neng)再来补)

猜你喜欢

转载自www.cnblogs.com/t-s-y/p/10317060.html