社区讨论

求助基于 Tarjan 的 LCA

P5002专心OI - 找祖先参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@ltll6z1f
此快照首次捕获于
2024/03/10 22:05
2 年前
此快照最后确认于
2024/03/11 12:49
2 年前
查看原帖
为什么本代码 595\sim 9 测试点 RE,102010\sim 20 测试点 MLE?
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+4;
#define int short 
#define pii pair<int,int>
int n,r,m;
int u,v;
vector<int>G[N];
vector<pii>Q[N];
int fa[N],ans[N];
bool vis[N];
int cnt;
int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void dfs(int u){
	fa[u]=u;
	vis[u]=1;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(vis[v]){
			continue;
		}
		dfs(v);
		fa[v]=u;
	}
	for(int i=0;i<Q[u].size();i++){
		int v=Q[u][i].first;
		if(vis[v]){
			ans[Q[u][i].second]=find(v);
		}
	}
} 
int ds[N];
int x;
signed main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>n>>r>>m;
	for(int i=1;i<n;i++){
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cnt++;
			Q[i].push_back({j,cnt});
			Q[j].push_back({i,cnt});
		}
	}
	dfs(r);
	for(int i=1;i<=cnt;i++){
		ds[ans[i]]++;
	}
	while(m--){
		cin>>x;
		cout<<ds[x]<<"\n";
	}
return 0;
}
验证码 7888 祭。

回复

3 条回复,欢迎继续交流。

正在加载回复...