演算法1:樹上倍增
//hdu 2586
#include
#include
#include
#define maxn 40000+5
#define inf 999999999
using
namespace
std;
int n,m,t,q,head[maxn],x,y,z,vis[maxn],fa[maxn],cost[maxn],dep[maxn],maxcost[maxn][20],anc[maxn][20];
struct xxb[maxn];
void add(int u,int v,int q)
; head[u]=m;
}int dfs(int t)
int st()
for (int j=1;(1
}int query(int p,int q)
ans+=maxcost[p][0]+maxcost[q][0];
return ans;
}int main()
}return
0;}
演算法2:tarjan
include #include
#include
#define maxn 80000+5
using
namespace
std;
int q,dis[maxn],t,x,y,z,n,m,num,head[maxn],vis[maxn],fa[maxn],h[maxn],ans[maxn];
struct xxb[maxn];
struct yyb2[405];
void add(int u,int v,int q)
; head[u]=m;
}void _add(int u,int v,int q)
; h[u]=num;
}int find(int x)
int dfs(int t,int val)
for (int k=h[t];k!=0;k=b2[k].next)
if (vis[b2[k].v])
return0;}
int main()
vis[1]=1;dfs(1,0);
for (int i=1;i<=q;i++) printf("%d\n",ans[i]);
}return
0;}
被資料坑得很慘,開始先寫了倍增,陣列只開了40000,但是神奇的a了。so後來寫tarjan時也只開了40000,一直re不明所以,找了很久錯qaq……然後把陣列開了兩倍大(雙向邊)就沒有然後了…… LCA 求最近公共祖先
洛谷3379 基本思路 要求兩個點的最近公共祖先,首先我們用乙個陣列fa x i 來表示節點x的向上2 i層的祖先編號,先dfs求出每個點的深度和預處理fa陣列。再求兩個節點的最近公共祖先時,先讓深度大的跳到相同的一層,再嘗試以log2 depth x 的跨度跳至祖先節點,相同時不跳 因為可能不是最...
LCA求最近公共祖先
parent i j 表示節點u的第2 j個祖先 dis i dfs時間戳,即節點到根節點距離,即深度 const int pow 18 const int maxn 5e5 10 int parent maxn pow 10 parent i j 表示節點u的第2 j個祖先 vectoredge ...
最近公共祖先 LCA 最近公共祖先
直接暴力搜尋參考 普通搜尋每次查詢都需要 樸素演算法是一層一層往上找,倍增的話直接預處理出乙個 具體做法是 維護乙個 的關係來線性求出這個陣列 int anc n 31 int dep n 記錄節點深度 void dfs int u,int parent for int i 0 i g u size...