您的位置:首页 > 其它

POJ1330 TarjanLCA

2016-08-08 19:14 218 查看
LCA裸题。

试着写了一下离线LCA算法。

自己的代码:

#include<cstdio>
#include<cstring>
using namespace std;
int n,t;
bool rt[10001];
struct e
{
int t;
e *n;
e(int t,e *n):t(t),n(n){}
}*f[10001]={};
namespace memo
{
e *stk[10001];
int top=-1;
void recycle(int n)
{
for(int i=1;i<=n;i++)
if(f[i])
{
stk[++top]=f[i];
f[i]=0;
}
}
e *alloc(int t,e *n)
{
if(top!=-1)
{
e *prov=stk[top];
stk[top]=stk[top]->n;
if(!stk[top]) --top;
prov->t=t;prov->n=n;
<
4000
span class="hljs-keyword">return prov;
}
return new e(t,n);
}
}
namespace tarjan
{
int ans;
int r[10001];
bool vis[10001];
int aim1,aim2;
int find(int x)
{return r[r[x]]==r[x]?r[x]:r[x]=find(r[x]);}
inline void link(int a,int b)
{
r[find(b)]=find(a);
}
void dfs(int x)
{
vis[x]=1;
for(e* i=f[x];i;i=i->n)
{
dfs(i->t);
link(x,i->t);
}
if(x==aim1&&vis[aim2]) ans=find(aim2);
else if(x==aim2&&vis[aim1]) ans=find(aim1);
}
void work(int n,int a,int b)
{
memset(vis,0,n+1);
aim1=a;aim2=b;
int root;
for(int i=1;i<=n;i++)
{
r[i]=i;
if(rt[i]) root=i;
}
dfs(root);
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int a,b;
memset(rt,1,n+1);
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
rt[b]=0;
f[a]=memo::alloc(b,f[a]);
}
scanf("%d%d",&a,&b);
for(int i=1;i<=n;i++)
{
if(rt[i]) {tarjan::work(n,a,b);break;}
}
printf("%d\n",tarjan::ans);
memo::recycle(n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: