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。树深搜的更多相关文章

  1. HDU 5423:Rikka with Tree Dijkstra算法

    Rikka with Tree  Accepts: 207  Submissions: 815  Time Limit: 2000/1000 MS (Java/Others)  Memory Limi ...

  2. hdu 5423 Rikka with Tree(dfs)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  3. hdu 5423 Rikka with Tree(dfs)bestcoder #53 div2 1002

    题意: 输入一棵树,判断这棵树在以节点1为根节点时,是否是一棵特殊的树. 相关定义: 1.  定义f[A, i]为树A上节点i到节点1的距离,父节点与子节点之间的距离为1. 2.  对于树A与树B,如 ...

  4. Hdu 5274 Dylans loves tree (树链剖分模板)

    Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...

  5. 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 ...

  6. HDU 2553 N皇后问题 (深搜)

    题目链接 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对 ...

  7. hdu 1242 不用标记数组的深搜

    #include<stdio.h>#include<string.h>char mapp[220][220];int m,n,mmin;void dfs(int x,int y ...

  8. (hdu)5423 Rikka with Tree (dfs)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5423 Problem Description As we know, Rikka is p ...

  9. hdu 6121---Build a tree(深搜+思维)

    题目链接 Problem Description HazelFan wants to build a rooted tree. The tree has n nodes labeled 0 to n− ...

随机推荐

  1. vue对象和视图

    1 Vue框架 1. vue 与 jQuery 区别 jQuery 仍然是操作DOM的思想, 主要jQuery 用来写页面特效 Vue是前端框架(MVVM) ,对项目进行分层. 处理数据 2 前端框架 ...

  2. 2017 清北学堂 Day 6终极考试报告

    预计分数: 100+70+70 = 240 实际假分数 : 40+80+70= 190  in cena(好吧不得不承认这个分数,,,,,,=.=) 实际真分数 : 100+80+100 = 280 ...

  3. Sql 行转换为列 以及列转换为行的心得

    这是 创建数据库的脚本文件 CREATE TABLE [dbo].[stu]( [学号] [nvarchar](255) NOT NULL, [姓名] [nvarchar](255) NULL, [性 ...

  4. MySQL报错竞技赛

    以下报错,我几乎没出过几个. ERROR 2 系统找不到文件: mysql-5.6.1X默认的配置文件是在C:\Program Files\MySQL\MySQL Server 5.6\my-defa ...

  5. 分布式锁----浅析redis实现

    引言大概两个月前小伙伴问我有没有基于redis实现过分布式锁,之前看redis的时候知道有一个RedLock算法可以实现分布式锁,我接触的分布式项目要么是github上开源学习的,要么是小伙伴们公司项 ...

  6. 用valgrind检查内存问题

    Valgrind Valgrind作为一个免费且优秀的工具包,平时大部分人可能都是使用valgrind检测内存问题,如内存泄露,越界等. Valgrind工具包包含多个工具,如Memcheck,Cac ...

  7. WPF中窗体在同一个位置实现不同页面切换

    要想在WPF窗体中实现不同页面切换,我们就需要用到ContentControl这个控件,这个控件的位置和大小就是你要显示页面的位置和大小. 下面举例说明: Xaml: <Grid> < ...

  8. urllib2功能说明

    1.urlopen(url, data, timeout) 第一个参数url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是设置超时时间. 第二三个参数是可以不传送的, ...

  9. java HttpServletRequest 重复流读取

    在用reset接口的时候,常常会使用request.getInputStream()方法,但是流只能读取一次,一旦想要加上一个过滤器用来检测用户请求的数据时就会出现异常.   在过滤器中通过流读取出用 ...

  10. PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)

    PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)  http://www.patest.cn/contests/pat-b-practise/1034 ...