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;
}
直接反向建图,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;
}
相关文章推荐
- GROUP for class: org.gradle.api.publication.maven.internal.deployer.DefaultGroovyMavenDeployer
- POJ 2352 Stars
- C语言_函数_例子
- Could not resolve all dependencies for configuration
- JS基础——修改文本框的值(函数传参)
- System.arrayCopy()的用法
- 面向服务的架构(SOA)
- linux 进程管理与调度(一)
- mysql的几种隐式转化
- 夯实JAVA基本之二 —— 反射(1):基本类周边信息获取
- 如何在KEIL中使用MicroLIB
- 【读书笔记】:哈工大软件学院编译原理期末考试复习概要
- Ubuntu下django项目的搭建
- 关于SpringMVC配置文件中使用<mvc:annotation-driven>标签报错的解 3ff0 决方式
- 欢迎使用CSDN-markdown编辑器
- delete实现多表删除
- Python与硬件学习笔记:超声波
- iOS图片拉伸技巧
- 【原】Gradle调用shell脚本和python脚本并传参
- ios推送