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)就可以了 当然 转二叉树候必须顾及原来树的一些性质 如不能只选左孩子 转 ...
随机推荐
- .htaccess重写规则失败
开启mod_rewrite.so LoadModule rewrite_module libexec/apache2/mod_rewrite.so 重启服务 sudo apachectl restar ...
- subprocess使用小方法
import subprocess def create_process(cmd): p = subprocess.Popen(cmd, shell=True, stdout=subp ...
- swfit:运算符重载 Operator Methods
Operator Methods Classes and structures can provide their own implementations of existing operators. ...
- mybatis传入参数类型parameterType和输出结果类型resultType详解
前言 Mybatis的Mapper文件中的select.insert.update.delete元素中都有一个parameterType和resultType属性,parameterType属性用于对 ...
- 获取Java接口的所有实现类
获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...
- select2宽度占比100%,导致无法实现浮动效果
- Vue 在beaforeCreate时获取data中的数据
众所周知,vue在beforecreate时期是获取不到data中的 数据的 但是通过一些方法可以实现在beforecreate时获取到data中的数据 暂时想到两种放发可以实现,vue在before ...
- webpack打包 css文件里面图片路径 替换位置
{ test: /\.css$/, use: ExtractTextPlugin.extract({ use: ['css-loader?minimize', 'autoprefixer-loader ...
- 获取指定点的RGB值
实现效果: 知识运用: Color对象的RGB属性 实现代码: private void button1_Click(object sender, EventArgs e) { OpenFileDia ...
- 有n个整数,使其前面各数顺序向后移n-m个位置,最后m个数变成最前面的m个数
题目:有n个整数,使其前面各数顺序向后移n-m个位置,最后m个数变成最前面的m个数 public class 第三十六题数组向后移m个位置 { public static void main(Stri ...