DFS序求调
查看原帖
DFS序求调
1382982
jikky楼主2024/9/13 16:45
#include<bits/stdc++.h>
#define time tim
using namespace std;
const int N=3e6+10;
int mi[N][20];
int md[N][20];
int lg[N];
struct M{
	int ne;
	int v;
}e[N];
int ndfn[N];
int faaa[N];
struct node{
	int deep;
	int dfn;
	int fa;
}no[N];
int n,m,s;
int tot=0;
int head[N];
void add(int u,int v){
	e[++tot].v=v;
	e[tot].ne=head[u];
	head[u]=tot;
}
int time=0;
int deep=0;
void dfs(int k,int fa){
	time++;
	deep++;
	if(!no[k].dfn){
		ndfn[k]=time;
		no[k].dfn=time;
		no[k].deep=deep;
	}
	for(int i=head[k];i;i=e[i].ne){
		if(e[i].v!=fa){
			no[e[i].v].fa=k;
			dfs(e[i].v,k);
		}
	}
	deep--;
	return;
}

int ask(int x,int y){
	int minn=214748364;
	int c=0;
	x=ndfn[x];
	y=ndfn[y];
	if(x>y){
		swap(x,y);
	}
	//x++;
	int d=lg[y-x+1];
	c=min(mi[x][d],mi[y-(1<<(d))+1][d]);
	if(c==mi[x][d]){
		c=md[x][d];
	}
	else{
		c=md[y-(1<<(d))+1][d];
	}
	return c;
}

bool cmp(node a,node b){
	return a.dfn<b.dfn;
}


int main(){
	scanf("%d%d%d",&n,&m,&s);
	int u,v;
	for(int i=1;i<n;i++){
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	lg[1]=0;
	no[s].fa=s;
	for(int i=2;i<=n;i++){
		lg[i]=lg[i>>1]+1;
	}
	dfs(s,s);
	memset(mi,0x3f,sizeof(mi));
	sort(no+1,no+n+1,cmp);
	for(int i=1;i<=n;i++){
		mi[i][0]=no[i].deep;
		md[i][0]=no[i].fa;
	}
	int x=0,y=0;
	for(int j=1;j<=lg[n];j++){
		for(int i=1;i<=n-(1ll<<(j))+1;i++){
			mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);
			if(mi[i+(1<<(j-1))][j-1]>mi[i][j-1]){
				md[i][j]=md[i][j-1];
			}
			else{
				md[i][j]=md[i+(1<<(j-1))][j-1];
			}
		}
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		if(x==y){
			printf("%d\n",x);
		}
		else printf("%d\n",ask(x,y));
	}
	return 0;
}
2024/9/13 16:45
加载中...