蒟蒻複習之 LCA

2021-08-09 17:59:23 字數 1879 閱讀 1668

#蒟蒻複習之-----lca#

//這兩年考lca考的特別多,qaq

//重要不重要自己體會

#1.tarjan#

都說tarjan的好寫,一直沒看過

今天看了看挺簡單的,比倍增的好寫多了

//個人比較喜歡打多個函式,**有點長

模版題

#include#include#includeusing namespace std;

const int maxn = 500000 + 100;

int n,m,s;

struct edge e[maxn<<1];

int head[maxn], tot = 0;

struct node no[maxn<<1];

int he[maxn],cnt = 0,f[maxn];

int read()

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

return x * t;

}int find(int x)

int merge(int u,int v)

}void add(int u, int v) ;

head[u] = tot;

}void add1(int u, int v,int num) ;

he[u] = cnt;

}int vis[maxn],lca[maxn];

void init()

void tarjan(int x)

} for(int i =he[x]; i; i = no[i].next)

}int main()

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

init();

tarjan(s);

for(int i = 1; i <= m;i++) e[maxn<<1];

int head[maxn], tot = 0;

int dep[maxn],f[maxn][30],vis[maxn],lg[maxn];

int read()

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

return x * t;

}void add(int u, int v) ;

head[u] = tot;

}void dfs(int x)

}}void init()

}}int lca(int x, int y)

}if(x == y) return x;

for(int i = 20; i >= 0; i--)

}return f[x][0];

}int main()

vis[s] = 1;

dfs(s);

init();

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

return 0;

}

#其他擴充套件#

##1.求路徑##

記錄乙個len陣列,len[i]表示節點i到根節點的距離

對任意的兩個節點u,v其距離為len[u]+len[v]-2*len[lca(u,v)]

##2.求路上最長路和最短路##

預處理

for(int j = 1; (1《查詢lca時

int lca(int x, int y)

}if(x == y) return x;

for(int i = 20; i >= 0; i--)

}sum = max(sum, d[x][0]);

sum = max(sum, d[y][0]);

return f[x][0];

}

蒟蒻複習之 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...