萌新求助,码风清新,样例通过,RE
查看原帖
萌新求助,码风清新,样例通过,RE
422348
Yang818楼主2022/12/24 19:56

Rt 悬赏关注 谢谢

#include<bits/stdc++.h>
#define F(_b,_e) for(int i=_b;i<=_e;i++)
using namespace std;

inline int read(){
	int f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return f*x;
}
const int MAXN=1010;
struct edge{
	int v,nxt;
}e[MAXN<<1];
int num=0,head[MAXN],fa[MAXN][24],deep[MAXN];
void add_edge(int u,int v){
	num++;
	e[num].nxt=head[u];
	e[num].v=v;
	head[u]=num;
}
void dfs(int p,int f){
	deep[p]=deep[fa[p][0]]+1;
	for(int i=0;fa[p][i];i++)
		fa[p][i+1]=fa[fa[p][i]][i];
	for(int i=head[p];i;i=e[i].nxt){
		int v=e[i].v;
		if(v==f)	continue;
		fa[v][0]=p;
		dfs(v,p);
	}
}
int lca(int m,int n){
	if(deep[m]>deep[n])	swap(m,n);
	for(int i=23;i>=0;i--)
		if(deep[fa[n][i]]>=deep[m])
			n=fa[n][i];
	if(m==n)
		return m;
	for(int i=23;i>=0;i--){
		if(fa[m][i]!=fa[n][i]){
			m=fa[m][i];
			n=fa[n][i];
		}
	}
	return fa[m][0];
}
int main(){
	ios::sync_with_stdio(0);
	int T;
	T=read();
	int k=T;
	while(T--){
		memset(e,0,sizeof(e));
		memset(fa,0,sizeof(fa));
		memset(deep,0,sizeof(deep));
		memset(head,0,sizeof(head));
		int n;
		n=read();
		for(int i=1;i<=n;i++){
			int m=read();
			for(int j=1;j<=m;j++){
				int v=read();
				add_edge(i,v);
				add_edge(v,i);
			}
		}
		dfs(1,0);
		int q=read();
		cout<<"Case "<<k-T<<":"<<endl;
		for(int i=1;i<=q;i++){
			int u,v;
			u=read();
			v=read();
			cout<<lca(u,v)<<endl;
		}
	} 
	return 0;
}
2022/12/24 19:56
加载中...