當我這個蒟蒻遇上了倍增求LCA

2021-08-29 02:43:03 字數 1086 閱讀 3330

我們機房的大佬上來就給我上**,居然挺好理解。

```/*倍增求lca*/

#include

#define ll long long

#define r read()

#define inf 3003000

using namespace std;

struct nodea[inf];//定義樹上每乙個節點所相連的邊

ll n,m,s,i,b,lg[inf],x,y,cnt;

ll f[500500][30],d[inf],h[inf];

//f[i][j]代表i節點的2^j邊相連的節點

//d[i]為深度

//h[cnt]為前向星存邊

inline long long read()//讀入優化

while (c>='0' && c<='9')

return x*k;

}void add(ll u,ll v)//加邊

void dfs(ll x,ll y)//其實這個函式是求f陣列

if (x==y) return x;//如果統一在了統一節點,則此節點為最近公共祖先

for (i=lg[d[x]];i>=0;i--)//從d[x]開始倍增求祖先的下一層

return f[x][0];//因為求的是下一層,就向上移一層

}int main()

dfs(s,0);

ll t=0;

for (i=1;i<=n;i++) lg[i]=lg[i-1]+(1

fclose(stdin);

fclose(stdout);

return 0;

}```

這個倍增的效率優化就是不用逐層查詢祖先,而是指數查詢。

在此%%%教我的大佬@wszjj 。

蒟蒻複習之 Floyd

暴力無解演算法 入門必備 然而我發現這個簡單的演算法還有很多用法 作為複習篇不講原理 圖的要求 既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環 複雜度為o n 3 原理 dp思路 f i j f i k f k j void floyd 注意 1應對所建的圖進行初始化如下 void i...

蒟蒻複習之 SPFA,dijkstra

蒟蒻複習之 spfa,dijkstra 好把這個太簡單了 作為複習篇不講原理 dijkstra 表示很少用,即使他要比spfa穩定 附贈 模版題 include include include includeusing namespace std const int maxn 500000 100 ...

蒟蒻複習之 Tarjan

蒟蒻複習之 tarjan 強連通圖的判斷方法 作為複習篇不講原理 noip2015 資訊傳遞 就是找乙個最小環 標準的模板題 雖然有很多解法 include include include includeusing namespace std const int maxn 200000 100 in...