代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=500005;
int fa[MAXN],vis[MAXN],ans[MAXN];
vector<int> g[MAXN];
vector<int> query[MAXN],query_id[MAXN];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void tarjan(int x)
{
vis[x]=1;
for(int i=0;i<g[x].size();i++)
{
int y=g[x][i];
if(vis[y])continue;
tarjan(y);
fa[y]=x;
}
for(int i=0;i<query[x].size();i++)
{
int y=query[x][i],id=query_id[x][i];
if(vis[y]==2)
{
ans[id]=find(y);
}
}
vis[x]=2;
}
int main()
{
int n,m,s;
cin>>n>>m>>s;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
query[x].push_back(y);
query[y].push_back(x);
query_id[x].push_back(i);
query_id[y].push_back(i);
}
tarjan(s);
for(int i=1;i<=m;i++)cout<<ans[i]<<endl;
}
共 7 条回复
@wpx001,您的代码就是倍增的,我已经会了,但是两种都会应该是比较稳妥的办法
就算会拿我的代码去洛谷提交也是不能全对的啊
不是,你没代码怎么调
让调,你tm发代码是几个意思啊
少了一行代码……
已经条完了
不常用,可以试试这个