HDU-5423 Rikka with Tree。树深搜
Rikka with Tree
题意:给出树的定义,给出树相似的定义和不同的定义,然后给出一棵树,求是否存在一颗树即和其相似又与其不同。存在输出NO,不存在输出YES。
思路:以1号节点为根节点,我们观察到一颗树如果不存在这种树即与其相似又与其不同,那么这棵树要么所有节点的深度都不一样,要么有深度一样的并且他们的父节点都一样,后来想想,如果当前节点的父节点有多个儿子,那么当前节点则不能有儿子节点,否则就可以将儿子节点转移到兄弟节点上。思路很正确,比赛的时候用深搜递归写就错了,改成两层循环枚举任意两个节点看是否符合情况然后就过了,,过了。。代码能力还是不行啊,思路都一样,哪里写错了都不知道。
来看两种写法:
深搜标记:WA?
void init()
{
memset(d,0,sizeof(d));
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
for(int i=0;i<N;i++) g[i].clear();
}
void dfs(int u,int fa)
{
d[u]=d[fa]+1;
if(vis1[d[u]])
{
if(vis1[d[u]]!=fa)//度相同根节点不同那么可以互换
{f=1;
// printf("%d %d %d %d\n",u,fa,d[u],vis1[d[u]]);
}
}
else vis1[d[u]]=fa;
int len=g[u].size();
if(len>1) vis2[u]=1;
for(int i=0;i<len;i++)
{
int v=g[u][i];
if(v!=fa)
{
// printf("%d %d %d %d %d\n",v,u,fa,d[u],vis1[d[u]]);
if(u!=fa&&vis2[fa]) f=1;
dfs(v,u);
}
}
}
int main()
{
int n,u,v;
while(~scanf("%d",&n))
{
init();
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
f=0;
dfs(1,1);
if(f) puts("NO");
else puts("YES");
}
return 0;
}
以上有种样例能debug:
5
1 2
2 3
3 4
3 5
output: NO
Answer : YES
深搜预处理+枚举,AC!正确思路:父节点一样的情况下不能有儿子节点,否则可以将儿子节点转移至兄弟节点。
void init()
{
memset(pre,0,sizeof(pre));
memset(d,0,sizeof(d));
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
for(int i=0; i<N; i++) g[i].clear();
}
void dfs(int u,int fa)
{
d[u]=d[fa]+1;
pre[u]=fa;
int len=g[u].size();
for(int i=0; i<len; i++)
{
int v=g[u][i];
if(v!=fa) dfs(v,u);
}
}
int main()
{
int n,u,v;
while(~scanf("%d",&n))
{
init();
for(int i=1; i<n; i++)
{
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
f=0;
dfs(1,1);
for(int i=1; i<=n&&!f; i++)
for(int j=1; j<=n&&!f; j++)
if(i!=j&&d[i]==d[j])
{
if(pre[i]==pre[j])
{
int k1=g[i].size();
int k2=g[i].size();
if(k1>1||k2>1) f=1;
}
else f=1;
}
if(f) puts("NO");
else puts("YES");
}
return 0;
}
HDU-5423 Rikka with Tree。树深搜的更多相关文章
- HDU 5423:Rikka with Tree Dijkstra算法
Rikka with Tree Accepts: 207 Submissions: 815 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- hdu 5423 Rikka with Tree(dfs)
Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...
- hdu 5423 Rikka with Tree(dfs)bestcoder #53 div2 1002
题意: 输入一棵树,判断这棵树在以节点1为根节点时,是否是一棵特殊的树. 相关定义: 1. 定义f[A, i]为树A上节点i到节点1的距离,父节点与子节点之间的距离为1. 2. 对于树A与树B,如 ...
- Hdu 5274 Dylans loves tree (树链剖分模板)
Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...
- hdu 5648 DZY Loves Math 组合数+深搜(子集法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5648 题意:给定n,m(1<= n,m <= 15,000),求Σgcd(i|j,i&am ...
- HDU 2553 N皇后问题 (深搜)
题目链接 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对 ...
- hdu 1242 不用标记数组的深搜
#include<stdio.h>#include<string.h>char mapp[220][220];int m,n,mmin;void dfs(int x,int y ...
- (hdu)5423 Rikka with Tree (dfs)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5423 Problem Description As we know, Rikka is p ...
- hdu 6121---Build a tree(深搜+思维)
题目链接 Problem Description HazelFan wants to build a rooted tree. The tree has n nodes labeled 0 to n− ...
随机推荐
- ubuntu下sublime屏蔽alt键显示顶部菜单栏
在sulime下喜欢把方向键映的上下左右映射为alt+i/k/j/l ,按单词移动alt+h/; 但是在ubuntu下按alt会弹出sublime的顶部菜单栏,如果想屏蔽sublime按alt屏蔽菜单 ...
- mysql实现计数器
本文转自:https://blog.csdn.net/stevendbaguo/article/details/70889449 如果是在非常高的并发之下,还是建议用内存数据库redis去实现计数的功 ...
- 2018百度之星初赛(A)2 度度熊学队列
思路: 记录一下c++ stl中的双向链表list的各种用法. https://blog.csdn.net/fanyun_01/article/details/56881515 实现: #includ ...
- 获取SD卡下Android/data/下文件
通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data/<application package>/cache 这个路径.选择在这个位置有两点好处:第一,这 ...
- Android上线check_list
Android 上线 check_list 类型 序号 检查项 结果(pass/no) 安装 卸载 1 非Root环境下的安装.卸载 2 Root环境下的安装.卸载 3 安装文件检查,无泄漏用户信息的 ...
- C#入门(2)
C#入门(2) Exception 基本异常的核心成员: System.Exception Property Meaning Data read-only,实现了IDirectory接口的一些键值对, ...
- root.sh脚本支持checkpoints文件实现重复运行
安装集群GRID/GI一般包括三个过程:首先,运行OUI/RunInstaller输入集群配置信息,其次,拷贝/编译集群文件,最后,以root用户运行root.sh脚本配置集群/启动集群,其中运行ro ...
- (转)SpringMVC学习(六)——SpringMVC高级参数绑定与@RequestMapping注解
http://blog.csdn.net/yerenyuan_pku/article/details/72511749 高级参数绑定 现在进入SpringMVC高级参数绑定的学习,本文所有案例代码的编 ...
- JS常用操作节点的方法
js常见的创建dom节点的方法有 createElement() 创建一个元素节点 => 接收参数为string类型的nodename createTextNode() 创建一个文本节点 =&g ...
- javaEE(16)_Servlet监听器
一.监听器原理 1.监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 2.监听器典型案例 ...