您的位置:首页 > 其它

POJ-1330-只询问一次的LCA

2015-11-27 17:27 344 查看
求两个点的最近公共祖先

直接反向建图,2个dfs完事。。

当然如果是多个询问 得用rmq/tarjan了。。

水只。。。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;

int n,m;
vector<int> mp[10005];
int path_x[10005];
int okx;
int root;
int oky;
int path_y[10005];
int x,y;
int vis[10005];
int dfs_find_Ancestors(int z,int path[],int &ok)
{
path[++ok]=z;
if (z==root)
return 0;
else
dfs_find_Ancestors(mp[z][0],path,ok);

}
int main()
{

int i;
int t;cin>>t;
while(t--)
{
cin>>n;
for (i=1;i<=n;i++)
mp[i].clear();

for (i=1;i<=n-1;i++)
{
scanf("%d%d",&x,&y);
mp[y].push_back(x);
vis[y]=1;
}
for (i=1;i<=n;i++)
{
if (vis[i]==0)
{
root=i;break;
}

}
scanf("%d%d",&x,&y);
okx=oky=0;
dfs_find_Ancestors(x,path_x,okx);
dfs_find_Ancestors(y,path_y,oky);

/* for (i=1;i<=okx;i++)
{
printf("%d ",path_x[i]);
}
printf("\n");

for (i=1;i<=oky;i++)
{
printf("%d ",path_y[i]);
}
printf("\n");
*/
memset(vis,0,sizeof(vis));
for (i=1;i<=okx;i++)
{
vis[path_x[i]]=1;
}
int ans=-1;
for (i=1;i<=oky;i++)
{
if (vis[path_y[i]]==1)
{
ans=path_y[i];
break;
}
}

printf("%d\n",ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: