为什么我的Tarjan没有倍增快?
  • 板块学术版
  • 楼主cyj0314
  • 当前回复3
  • 已保存回复4
  • 发布时间2023/12/13 20:11
  • 上次更新2023/12/13 23:05:49
查看原帖
为什么我的Tarjan没有倍增快?
944143
cyj0314楼主2023/12/13 20:11

这是我的倍增这是评测记录

#include<cstdio>
#include<cmath>
using namespace std;
const int MAXN=5e5;
const int MAXL=log2(MAXN)+10;
struct edge{
	int to,nxt;
}e[MAXN*2+10];
int n,q,s,lg,cnt,hd[MAXN+10],d[MAXN+10],f[MAXN+10][MAXL+10];
bool vis[MAXN+10];
void myswap(int &x,int &y){
	x^=y;
	y^=x;
	x^=y;
	return;
}
void add(int u,int v){
	++cnt;
	e[cnt].to=v;
	e[cnt].nxt=hd[u];
	hd[u]=cnt;
	return;
}
void dfs(int x,int lst){
	vis[x]=true;
	d[x]=d[lst]+1,f[x][0]=lst;
	for(int i=1;(1<<i)<=d[x];i++)
		f[x][i]=f[f[x][i-1]][i-1];
	for(int i=hd[x];i;i=e[i].nxt)
		if(!vis[e[i].to])
			dfs(e[i].to,x);
	return;
}
int lca(int x,int y){
	if(x==y)
		return x;
	if(d[x]<d[y])
		myswap(x,y);
	for(int i=lg;i>=0;i--)
		if(d[x]-(1<<i)>=d[y])
			x=f[x][i];
	if(x==y)
		return x;
	for(int i=lg;i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0];
}
int main(){
	scanf("%d%d%d",&n,&q,&s);
	lg=log2(n);
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	dfs(s,0);
	for(int i=1;i<=q;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		printf("%d\n",lca(x,y));
	}
	return 0;
}

这是我的Tarjan这是评测记录

#include<cstdio>
using namespace std;
const int MAXN=5e5;
struct edge{
	int to,nxt;
}e[MAXN*2+10],qry[MAXN*2+10];
int n,q,s,ans[MAXN+10],cnt,hde[MAXN+10],hdq[MAXN+10],id[MAXN+10],fa[MAXN+10];
bool vis[MAXN+10];
int fr(int x){
	int root=x;
	while(root!=fa[root])
		root=fa[root];
	while(fa[x]!=x){
		int t=x;
		x=fa[x];
		fa[t]=root;
	}
	return root;
}
void adde(int u,int v){
	++cnt;
	e[cnt].to=v;
	e[cnt].nxt=hde[u];
	hde[u]=cnt;
	return;
}
void addq(int x,int y,int i){
	++cnt;
	qry[cnt].to=y;
	qry[cnt].nxt=hdq[x];
	hdq[x]=cnt;
	id[cnt]=i;
	return;
}
void tarjan(int x){
	vis[x]=true;
	for(int i=hde[x];i;i=e[i].nxt)
		if(!vis[e[i].to]){
			tarjan(e[i].to);
			fa[e[i].to]=x;
		}
	for(int i=hdq[x];i;i=qry[i].nxt)
		if(vis[qry[i].to])
			ans[id[i]]=fr(qry[i].to);
	return;
}
int main(){
	scanf("%d%d%d",&n,&q,&s);
	for(int i=1;i<=n;i++)
		fa[i]=i;
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		adde(u,v);
		adde(v,u);
	}
	cnt=0;
	for(int i=1;i<=q;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		addq(x,y,i);
		addq(y,x,i);
	}
	tarjan(s);
	for(int i=1;i<=q;i++)
		printf("%d\n",ans[i]);
	return 0;
}

T了3个,蛙了4个 求解,悬关!

2023/12/13 20:11
加载中...