lca 點的距離

2021-09-25 18:14:03 字數 1287 閱讀 4543

給定一棵有n個結點的樹,q個詢問,每次詢問點x到點y亮點之間的距離

第一行乙個n,表示有n個節。

接下來有n-1行,每行2個整數x,y表示x,y之間有一條連邊。

然後乙個整數q,表示有q次詢問,接下來q行每行2個整數x,y表示詢問x到y的距離。

輸出q行,每行表示每個詢問的結果

6

1 21 3

2 42 5

3 62

2 65 6

3

4

思路:倍增法求lca板子題,dfs+打表+查詢就ok,只需在輸出結果時稍微加減即可(注釋有寫

**:

#includeusing namespace std;

const int maxn = 4e5+10;

int n,q,num_edge;

int f[maxn],depth[maxn];

//f記錄父節點,depth記錄深度

int st[30][maxn];

//第一維i表示跳2^i層,第二維j表示開始跳的起點

//陣列記憶體的資料表示跳到的終點

int first[maxn],next[2*maxn],v[2*maxn];

//v記錄邊的終點,next記錄上一條邊的標號

//first記錄最後一條邊的標號

void road(int x,int y) //記錄從x到y的一條邊

void dfs(int son,int father)

}int get_lca(int x,int y)

int main()

//預處理depth

depth[1]=1;//根節點深度為1

dfs(1,0);//處理剩餘的depth

//準備st表

//如果跳2^0層即跳一層,則會跳到自己的父節點

for(int i = 1; i <= n; i++)

st[0][i]=f[i];

//如果從j跳2^i層能到達st[i][j]

//因為2^(i-1)+2^(i-1)=2^i

//那麼從j跳2^(i-1)層所到達的點再跳2^(i-1)層也能到st[i][j]

for(int i = 1; i <= 20; i++)

for(int j = 1; j <= n; j++)

st[i][j]=st[i-1][st[i-1][j]];

//q次查詢

scanf("%d",&q);

while(q--)

return 0;

}

倍增法lca 點的距離(鏈式前向星)

給定一棵有n個結點的樹,q個詢問,每次詢問點x到點y亮點之間的距離 第一行乙個n,表示有n個節。接下來有n 1行,每行2個整數x,y表示x,y之間有一條連邊。然後乙個整數q,表示有q次詢問,接下來q行每行2個整數x,y表示詢問x到y的距離。輸出q行,每行表示每個詢問的結果 6 1 21 3 2 42...

疑難雜題 距離(LCA)

給出 n 個點的一棵樹,多次詢問兩點之間的最短距離。注意 邊是無向的。所有節點的編號是 1,2,n。輸入格式 第一行為兩個整數 n 和 m。n 表示點數,m 表示詢問次數 下來 n 1 行,每行三個整數 x,y,k,表示點 x 和點 y 之間存在一條邊長度為 k 再接下來 m 行,每行兩個整數 x,...

距離諮詢 tarjan求lca

農夫約翰有n 2 n 40000 個農場,標號1到n。m 2 m 40000 條的不同的垂直或水平的道路鏈結著農場,道路的長度不超過1000.這些農場的分布就像下面的地圖一樣,圖中農場用f1.f7表示 每個農場最多能在東西南北四個方向鏈結4個不同的農場。此外,農場只處在道路的兩端。道路不會交叉而且每...