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)就可以了 当然 转二叉树候必须顾及原来树的一些性质 如不能只选左孩子 转 ...
 
随机推荐
- Failure to transfer org.apache.maven.plugins:maven-compiler-plugin:jar:2.5.1
			
Mac上写了一段基于Maven的java代码. 上传Git后,在windows上pull下来,eclipse里面各种错误. ArtifactTransferException:Failure to t ...
 - (译文)IOS block编程指南 4 声明和创建blocks
			
Declaring and Creating Blocks (声明和创建blocks) Declaring a Block Reference (声明一个block引用) Block variable ...
 - Python3简明教程(九)——  文件处理
			
文件是保存在计算机存储设备上的一些信息或数据.你已经知道了一些不同的文件类型,比如你的音乐文件,视频文件,文本文件.Linux 有一个思想是“一切皆文件”,这在实验最后的 lscpu 的实现中得到了体 ...
 - 一次执行两个npm "start": "concurrently 'npm:dev' 'npm:json-server'"
			
用的这个程序 concurrently 说是再有异步的时候,&& 就不好使,而且&& 也不能执行npm 只能执行命令 官方地址:https://www.npmjs.co ...
 - 命令终端执行python
			
windows进入cmd 1.进入cmd窗口,找到存放py文件的地址(如E:\learn_mock) 2.退出python,输入exit() linux下一样
 - Linux下scp报Permission denied错误的解决方法
			
sudo vim /etc/ssh/sshd_config 把PermitRootLogin no改成PermitRootLogin yes如果原来没有这行或被注释掉,就直接加上PermitRootL ...
 - [BZOJ3207]:花神的嘲讽(分块解法)
			
题目传送门 题目描述:背景花神是神,一大癖好就是嘲讽大J,举例如下:“哎你傻不傻的![hqz:大笨J]”“这道题又被J屎过了!!”“J这程序怎么跑这么快!J要逆袭了!”…… 描述这一天DJ在给吾等众蒟 ...
 - Supreme Number
			
A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...
 - 对数组内容使用了json_encode返回汉字内容返回了空值
			
如果使用json_encode对数组进行转成JSON字符串时候,发现汉字的全部为空,这样可以说明的一点是你的页面上用的一定不是UTF8编码,在PHP手册中对json_encode中待编码的值已经说明所 ...
 - C语言学习13
			
快速排序 //快速排序 #include <stdio.h> void quicksort(int a[], int left, int right); void main() { ] = ...