蜜汁 RE 求助
查看原帖
蜜汁 RE 求助
638537
g1ove楼主2024/3/7 19:31

rt

#include<bits/stdc++.h>
#define N 10005
using namespace std;
int g;
int n;
int head[N],tot=1;
struct edge{
	int to,next,w;
}e[N*2];
void add(int u,int v,int w)
{
	e[tot]=(edge){v,head[u],w};
	head[u]=tot++;
}
void init()
{
	tot=1;
	memset(head,0,sizeof head);
}
int dep[N],f[N][15],w[N];
void dfs(int now,int fa)
{
	f[now][0]=fa;
	dep[now]=dep[fa]+1;
	for(int i=1;f[now][i-1];i++)
		f[now][i]=f[f[now][i-1]][i-1];
	for(int i=head[now];i;i=e[i].next)
	{
		int v=e[i].to;
		if(v==fa) continue;
		w[v]=w[now]+e[i].w;
		dfs(v,now);
	}
}
int glca(int u,int v)
{
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=13;i>=0;i--)
		if(dep[f[u][i]]>=dep[v]) u=f[u][i];
	if(u==v) return u;
	for(int i=13;i>=0;i--) 
		if(f[u][i]^f[v][i]) u=f[u][i],v=f[v][i];
	return f[u][0];
}
int kfa(int u,int k)
{
	for(int i=13;i>=0;i--)
		if(k>=(1<<i)) u=f[u][i],k-=(1<<i);
	return u;
}
int main()
{
	scanf("%d",&g);
	while(g--)
	{
		init();
		scanf("%d",&n);
		for(int i=1;i<=n-1;i++)
		{
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			add(u,v,w);
			add(v,u,w);
		}
		dfs(1,0);
		while(1)
		{
			char opr[2];
			int u,v,k,lca;
			scanf("%s",opr);
			if(opr[1]=='O') break;
			scanf("%d%d",&u,&v);
			lca=glca(u,v);
			if(opr[1]=='I')
				printf("%d\n",w[u]+w[v]-2*w[lca]);
			if(opr[1]=='T') 
			{
				scanf("%d",&k);
				if(dep[u]-dep[lca]+1>=k)printf("%d\n",kfa(u,k));
				else printf("%d\n",kfa(v,dep[u]+dep[v]-2*dep[lca]+1-k));
			}
		}
	}
	return 0;
}
2024/3/7 19:31
加载中...