【模板】LCA

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#define int long long
using namespace std;
const int N=2e5+5;
inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
int n,m,tot,ans;
int head[N*2],nxt[N*2],to[N*2],w[N*2],cnt;
int f[N][20],d[N],dis[N],dfn[N];
void add(int x,int y,int z) {
    to[++cnt]=y,w[cnt]=z,nxt[cnt]=head[x],head[x]=cnt;
}
void dfs(int x,int fath) {
	dfn[x]=++tot;
	f[x][0]=fath;
	for(int i=1;i<20;i++) {
		f[x][i]=f[f[x][i-1]][i-1];
		if(!f[x][i]) break;
	}
    for(int i=head[x];i;i=nxt[i]) {
        int v=to[i];
        if(v==fath) continue;
        dis[v]=dis[x]+w[i];
        d[v]=d[x]+1;
        dfs(v,x);
    }
}
int Lca(int x,int y) {
	if(d[x]<d[y]) swap(x,y);
	for(int i=19;i>=0;i--) {
		if(f[x][i]&&d[f[x][i]]>=d[y]) x=f[x][i];
	}
	if(x==y) return x;
	for(int i=19;i>=0;i--) {
		if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	}
	return f[x][0];
}
int dist(int x,int y) {
	int lc=Lca(x,y);
	return dis[x]+dis[y]-2*dis[lc];
}
signed main() {
	n=read();
	for(int i=1;i<n;i++) {
		int x=read(),y=read(),z=read();
		add(x,y,z); add(y,x,z);
	}
}
posted @ 2020-12-11 17:49  仰望星空的蚂蚁  阅读(8)  评论(0)    收藏  举报  来源