最近打算狂撸一下图论和数据结构的题。当是复习数据结构!
但是每天都感觉好困。。。。QAQ。。。。
这就是到裸的CLA。。。。并且只查询一次,所以难度降低了很多。如果是二叉树还有其他方法。
Tarjan的思想觉得自己没有太明白,理解的时候不是很。。。恩。
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
#define maxn 10010
vector<int>que[maxn];
int father[maxn],in[maxn];
int st,x,y,ans;
int find(int x)
{
if(x==father[x]) return x;
father[x]=find(father[x]);
return father[x];
}
void bind(int xx,int yy)
{
father[xx]=yy;
}
void CLA(int u)
{
if(st==2) return;
for(int i=0;i<que[u].size();i++)
{
int j=que[u][i];
CLA(j);
bind(j,u);
}
if(u==x||u==y) st++;
if(st==2&&ans==0)
{
int p=(u==x)?y:x; //确定哪个是先被访问过的
ans=find(p); <span style="white-space:pre"> </span> //其实这里貌似也不用压缩路径的说。。。
}
}
void init()
{
memset(in,0,sizeof(in));
st=0;ans=0;
for(int i=0;i<maxn;i++) que[i].clear();
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
init();
scanf("%d",&n);
int j,k;
for(int i=0;i<n-1;i++)
{
scanf("%d%d",&j,&k);
in[k]++;
que[j].push_back(k);
}
scanf("%d%d",&x,&y);
int root=0;
for(int i=1;i<=n;i++)
{
father[i]=i;
if(in[i]==0) root=i; //找到根节点
}
CLA(root);
printf("%d\n",ans);
}
return 0;
}