T1503 愚蠢的宠物 codevs
http://codevs.cn/problem/1503/
大家都知道,sheep有两只可爱的宠物(一只叫神牛,一只叫神菜)。有一天,sheep带着两只宠物到狗狗家时,这两只可爱的宠物竟然迷路了……
狗狗的家因为常常遭到猫猫的攻击,所以不得不把家里前院的路修得非常复杂。狗狗家前院有N个连通的分叉结点,且只有N-1条路连接这N个节点,节点的编号是1-N(1为根节点)。sheep的宠物非常笨,他们只会向前走,不会退后(只向双亲节点走),sheep想知道他们最早什么时候会相遇(即步数最少)。

第1行:一个正整数N,表示节点个数。
第2~N行:两个非负整数A和B,表示A是B的双亲。(保证A,B<=n)
第N+1行:两个非负整数A和B,表示两只宠物所在节点的位置。(保证A,B<=n)
输出他们最早相遇的节点号。
10
1 2
1 3
1 4
2 5
2 6
3 7
4 8
4 9
4 10
3 6
1
对于10%的数据,n<10^6
对于100%的数据,n<=10^6
#include <algorithm>
#include <cstdio>
#define maxn 100015 using namespace std; int n,a,b,ans;
int fa[maxn];
bool vis[maxn]; void will_go(int x)
{
vis[x]=;
if(!vis[fa[x]])
will_go(fa[x]);
} int meet(int x)
{
if(vis[x])
return x;
else
meet(fa[x]);
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<n;i++)
{
scanf("%d%d",&a,&b);
fa[b]=a;
}
scanf("%d%d",&a,&b);
will_go(a);
ans=meet(b);
printf("%d",ans);
return ;
}
并查集,搜a会经过的节点,用b去相遇
#include <algorithm>
#include <iostream>
#include <cstdio>
#define maxn 1000015 using namespace std; int n,a,b,s,t,ans;
int fa[maxn]; int find(int x)
{
if(x!=fa[x])
return fa[x]=find(fa[x]);
return x;
} int get(int x,int y)
{
if(x==find(y))
{
return x;
exit();
}
else
if(find(x)==y)
{
return y;
exit();
}
else
{
get(fa[x],y);
get(x,fa[y]);
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<n;i++)
{
scanf("%d%d",&a,&b);
fa[find(b)]=find(a);
}
scanf("%d%d",&s,&t);
ans=get(s,t);
printf("%d",ans);
return ;
}
并不知道怎么错的
#include <algorithm>
#include <cstdio>
#include <vector> using namespace std; const int N=1e6+;
vector<int>vec[N];
int n,x,y,deep[N],dad[N][]; void DFS(int x)
{
deep[x]=deep[dad[x][]]+;
for(int i=;i<dad[x][i];i++)
dad[x][i+]=dad[dad[x][i]][i];
for(int i=;i<vec[x].size();i++)
if(vec[x][i]!=dad[x][]) dad[vec[x][i]][]=x,DFS(vec[x][i]);
} int LCA(int x,int y)
{
if(deep[x]>deep[y]) swap(x,y);
for(int i=;i>=;i--)
if(deep[dad[y][i]]>=deep[x]) y=dad[y][i];
if(x==y) return x;
for(int i=;i>=;i--)
if(dad[x][i]!=dad[y][i])
x=dad[x][i],y=dad[y][i];
return dad[x][];
} int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
vec[x].push_back(y);
vec[y].push_back(x);
}
DFS();
scanf("%d%d",&x,&y);
printf("%d",LCA(x,y));
return ;
}
LCA倍增法
T1503 愚蠢的宠物 codevs的更多相关文章
- codevs——1503 愚蠢的宠物
1503 愚蠢的宠物 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 大家都知道,sheep有两 ...
- [codevs 1503]愚蠢的宠物(特殊的LCA)
题目:http://codevs.cn/problem/1503/ 分析:一道裸的LCA,但是由于询问只有一次,所以可以简单打打……可以从a,b向父节点推直到1节点,然后比较两个序列,后面一段肯定相同 ...
- CodeVS 1503 愚蠢的宠物
题目描述 Description 大家都知道,sheep有两只可爱的宠物(一只叫神牛,一只叫神菜).有一天,sheep带着两只宠物到狗狗家时,这两只可爱的宠物竟然迷路了…… 狗狗的家因为常常遭到猫猫的 ...
- rqnoj28[stupid]愚蠢的宠物
题目描述 背景 大家都知道,sheep有两只可爱的宠物(一只叫神牛,一只叫神菜).有一天,sheep带着两只宠物到狗狗家时,这两只可爱的宠物竟然迷路了…… 描述 狗狗的家因为常常遭到猫猫的攻击,所以不 ...
- 【rqnoj28】[Stupid]愚蠢的宠物
题目描述 背景 大家都知道,sheep有两只可爱的宠物(一只叫神牛,一只叫神菜).有一天,sheep带着两只宠物到狗狗家时,这两只可爱的宠物竟然迷路了…… 描述 狗狗的家因为常常遭到猫猫的攻击,所以不 ...
- PID28 [Stupid]愚蠢的宠物
题链:https://www.rqnoj.cn/problem/28 题目描述 背景 大家都知道,sheep有两只可爱的宠物(一只叫神牛,一只叫神菜).有一天,sheep带着两只宠物到狗狗家时,这两只 ...
- RNQOJ PID28 / [Stupid]愚蠢的宠物
勉勉强强够着点并查集的边,题目吧他分类到并查集也无可厚非,这里与常规的并查集的区别在于要做一个mark数组进行一下标记,展开来说就是对于要查询的A,B,先对A进行处理,把A所有的前驱也就是双亲节点进行 ...
- [题解] codevs 1486 愚蠢的矿工
http://codevs.cn/problem/1486/ 我们比较熟悉二叉树,题目中给出的是一棵多叉树,我们需要将这可二叉树改造成二叉树. 二叉树可以为这样的: 父亲结点左边储存儿子,右边储存兄弟 ...
- codevs愚蠢的矿工(树形DP)
/* 树形DP 根节点一定有人 然后 剩下的人没到每个孩子去 因为孩子数可能很多 不好枚举 所以转二叉树 分两部分 O(sum)就可以了 当然 转二叉树候必须顾及原来树的一些性质 如不能只选左孩子 转 ...
随机推荐
- java访问数据库步骤详解
eg1: public static void main(String[] args) throws ClassNotFoundException, SQLException { //第一步:加载JD ...
- Mysql数据库表的迁移和表的复制
同一台服务器上的,数据库之间的表的迁移: create table db.tablename as select * from db2.tablename; 此sql使用于mysql,从一台服务器上的 ...
- mybatis 存储过程的写法
(注意事项: 在使用游标的时候,不能在游标声明之前,使用crud) 存储过程示例 CREATE DEFINER=`root`@`::` PROCEDURE `earnings_proceduce`() ...
- TensorFlow中屏蔽warning的方法
问题 使用sudo pip3 install tensorflow安装完CPU版tensorflow后,运行简单的测试程序,出现如下警告: I tensorflow/core/platform/cpu ...
- python基础一 day5 复习
bytes类型默认编码方式是utf-8和gbk,反正不是unicode strn内部的编码方式是Unicode range相当于只有一次,第一次之后相当于一个有序列表.range顾头不 ...
- JavaScript操作数组。
1.shift:删除原数组第一项,并返回删除元素的值,原数组为空则返回undefined. 2.unshift:将参数添加到原数组开头,并返回数组的长度. 3.pop:删除原数组最后一项,并返回删除元 ...
- 搜索 || DFS || POJ 1321 棋盘问题
棋盘上#可以放,.不可以放,每行每列只能放一个 *解法:类似八皇后问题 dfs+回溯,考虑每一行和每一列 [[[[dfs的样子]]]]最前面写达到目标状态or不能走下去了 然后return #incl ...
- No-6.用户权限相关命令
用户权限相关命令 目标 用户 和 权限 的基本概念 用户管理 终端命令 组管理 终端命令 修改权限 终端命令 01. 用户 和 权限 的基本概念 1.1 基本概念 用户 是 Linux 系统工作中重要 ...
- SQL比较两表字段和字段类型
一.问题 业务需要把TB_Delete_KYSubProject表数据恢复到TB_KYSubProject,但提示错误,错误原因是两表字段类型存在不一致 insert into [TB_KYSubPr ...
- 去BAT,你应该要看一看的面试经验总结
我去年12月份从上一家公司离职,一直到今年3月份,基本上都在面试中度过来的. 先交代下背景:坐标上海,做技术开发,我本人面试的职位是linux服务器开发,最倾向的职位是服务器开发主程或技术经理.我本人 ...