咳咳,进入重难点的图论算法之一(敲黑板):
题目: 洛谷 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)再来补)