成员:
const int maxn = 1007;
int up[maxn][32];
int depth[maxn];
int n,m;
bool vis[maxn];
vector<int> tree[maxn];
函数:
DFS记录深度和初始化倍增数组:
void dfs(int u, int d) {depth[u] = d;vis[u] = true;for(auto i : tree[u])if(!vis[i]) {dfs(i, d+1);up[i][0] = u;}
}
处理倍增数组:
void process() {for(int j=1 ; j<31 ; j++)for(int i=1 ; i<=n ; i++)if(up[i][j-1]!=-1)up[i][j] = up[up[i][j-1]][j-1];
}
LCA函数实现:
int lca(int u, int v) {if(depth[u] < depth[v]) swap(u,v);int tmp = depth[u] - depth[v];for(int j = 0 ; j <= 30 && depth[u] != depth[v] ; j++) {if(tmp&(1<if(u == v) return v;for(int j = 30 ; j>=0 ; j--) {if(up[u][j] != up[v][j])u = up[u][j], v = up[v][j];}return up[u][0];
}
汇总:
const int maxn = 1007;
int up[maxn][32];
int depth[maxn];
int n,m;
bool vis[maxn];
vector<int> tree[maxn];void dfs(int u, int d) {depth[u] = d;vis[u] = true;for(auto i : tree[u])if(!vis[i]) {dfs(i, d+1);up[i][0] = u;}
}void process() {for(int j=1 ; j<31 ; j++)for(int i=1 ; i<=n ; i++)if(up[i][j-1]!=-1)up[i][j] = up[up[i][j-1]][j-1];
}int lca(int u, int v) {if(depth[u] < depth[v]) swap(u,v);int tmp = depth[u] - depth[v];for(int j = 0 ; j <= 30 && depth[u] != depth[v] ; j++) {if(tmp&(1<if(u == v) return v;for(int j = 30 ; j>=0 ; j--) {if(up[u][j] != up[v][j])u = up[u][j], v = up[v][j];}return up[u][0];
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!