待更新......
先把代码贴上
#include<bits/stdc++.h>
using namespace std;
const int maxn=500000*2+10;
int head[maxn],tot=0,ver[maxn],nxt[maxn];
int headq[maxn],totq=1,verq[maxn],nxtq[maxn];
int ans[maxn],f[maxn];
bool vis[maxn];
void add(int x,int y)
{
ver[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
return;
}
void addq(int x,int y)
{
verq[++totq]=y;
nxtq[totq]=headq[x];
headq[x]=totq;
return;
}
int getf(int x) {return x==f[x]?x:f[x]=getf(f[x]);}
void merge(int t1,int t2)
{
t1=getf(t1);t2=getf(t2);
if(t1==t2)return;
f[t1]=t2;
return;
}
void tarjan(int x,int l)
{
for(int e=head[x];e;e=nxt[e])
{
if(ver[e]!=l)
{
tarjan(ver[e],x);
merge(ver[e],x);
vis[ver[e]]=true;
}
for(int i=headq[x];i>1;i=nxtq[i])
if(vis[verq[i]])
ans[i>>1]=getf(verq[i]);
}
}
int main()
{
int n,m,s;
scanf("%d %d %d",&n,&m,&s);
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
addq(x,y);
addq(y,x);
}
tarjan(s,0);
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}